【问题标题】:awk not capturing first line / separatorawk 没有捕获第一行/分隔符
【发布时间】:2015-06-22 15:16:40
【问题描述】:

我不理解以下行为:

这是一个文本文件:

example.txt
12345   4321    hello hello this is a test  blobb
14324   2131    another test , incoming !   blubb
52341   1231    last test now shutting down bla
...

它由 x 行文本组成,每行 4 个制表符分隔的列。我只需要前三个,所以我使用了awk(第一次):

awk '{FS="\t"; OFS="\t"; print $1,$2,$3}' < example.txt > excerpt.txt

结果是这样的:

excerpt.txt
12345   4321    hello
14324   2131    another test , incoming !
52341   1231    last test now shutting down
...

第一个条目不包含完整的第三列,打印$1,$2,$3,$4 会为第一行提供12345 4321 hello hello。因此,显然它在空格处分隔(在第一个和第二个 hello 之后),而不是在制表符处。我检查了是否有标签潜入其中,但事实并非如此:

我觉得这很令人困惑,因为它适用于所有其他行。

【问题讨论】:

    标签: bash awk


    【解决方案1】:

    您正在为每一行设置字段分隔符。然后,awk 读取记录(行),但以光标到达它时的方式读取,所以第一次设置它为时已晚无法应用于第一条记录。

    由于默认字段分隔符是空格,因此在第一行使用它。然后,从第二条记录开始,它会考虑之前设置的内容。

    需要在BEGIN块或者之前设置(效果一样):

    awk 'BEGIN{FS=OFS="\t"} {print $1,$2,$3}' example.txt > excerpt.txt
    
    awk -F"\t" -v OFS="\t" '{print $1,$2,$3}' example.txt > excerpt.txt
    

    或者,您也可以使用$1=$1 之类的内容“重新编译”记录。这会根据当前的字段分隔符重新解释记录。所以这也应该有效:

    awk '{FS=OFS="\t"; $0=$0; print $1,$2,$3}' example.txt > excerpt.txt
    

    测试

    在重新编译字段时测试最后一件事。

    $ cat a
    hello this      is me and
    here we are     doing some awk
    $ awk '{FS="\t"; print $2}' a
    this
    doing some awk
    $ awk '{FS="\t"; $0=$0; print $2}' a
    is me and
    doing some awk
    

    【讨论】:

    • 一个小提示,初始分隔符似乎是空格或制表符,因为它在其中任何一个处分隔。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-06
    • 2020-11-24
    • 2013-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多