【问题标题】:picking wrong column value from txt file unix从 txt 文件 unix 中选择错误的列值
【发布时间】:2017-11-01 10:52:04
【问题描述】:

我是脚本新手,遇到以下问题: 1. 在文本文件中获取“file:”值后,它应该跳过 2 行,然后从第 2 行读取

(--如果我在 txt 文件中找到“文件:”,我想跳过 2 行。这可能发生超过 1 次)。

i/p 文件是:

file : noki lab:3232 date : 12/3/16
field length position  text 
name   16 0     1      account name
info   1       10      Bank account info
city   3  0    13      bank acc city name
state  4       17      acc state

--这里我想跳过我在 txt 文件中找到“文件:”的 2 行。有可能发生超过 1 次。

  1. 阅读后我只想选择“归档”和“位置”列数据。 代码:

    awk -F ' ' '{print $1,$3}' ip.txt

但我得到了 o/p 之类的:

name 0
info 10
city 0
state 17

这是错误的,我需要输出:

name 1
info 10
city 13
state 17

【问题讨论】:

    标签: linux bash shell unix sh


    【解决方案1】:

    awk 来救援!

    $ awk '/^file :/ {c=2} 
           !(c&&c--) {print $1, $(NF-1)}' file
    
    name 1
    info 10
    city 13
    state 17
    

    说明 当模式匹配时,将计数器设置为 2,跳过指定的行数并从其余部分打印第一个和倒数第二个字段。

    更新 如果最后一列包含空格,则最简单(仅限gawk

    $ awk '/^file :/ {c=2}
           !(c&&c--) {print $1,gensub(/.* ([0-9]+)  .*/,"\\1",1)}' file
    name 1
    info 10
    city 13
    state 17
    

    否则,请花时间修复输入文件的格式。去掉字段之间多余的0,将字段分隔符更改为制表符等。

    【讨论】:

    • 看起来不错。我正在考虑找到一个可以让我从头开始索引的 shell 工具,但想不出一个简单的方法来做到这一点。 awk 显然很棒,但不能扩展。再说一次,对于这样的事情,它非常强大:)
    • 谢谢!忘记了这个方便的工具自然存在。
    • 非常感谢它看起来不错,但是当文本文件有以下数据时它会失败,然后它会选择错误的数据,因为它之间有空格:数据,例如:Rec ID 或 bank acc no
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-30
    • 2013-02-24
    • 1970-01-01
    • 2014-09-21
    • 1970-01-01
    • 1970-01-01
    • 2011-03-26
    相关资源
    最近更新 更多