awk没有捕获第一行/分隔符

时间:2015-06-19 19:52:38

标签: bash awk

我不了解以下行为:

这是一个文本文件:

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之后),而不是在标签处。我检查了一个标签是否在那里偷偷摸摸,但事实并非如此:

ctrl+f, \t

我发现这非常令人困惑,因为它适用于所有其他行。

1 个答案:

答案 0 :(得分:4)

您要在每一行设置字段分隔符。然后,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