我不了解以下行为:
这是一个文本文件:
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
之后),而不是在标签处。我检查了一个标签是否在那里偷偷摸摸,但事实并非如此:
我发现这非常令人困惑,因为它适用于所有其他行。
答案 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