你能用awk打印一条记录吗?

时间:2015-11-27 13:21:14

标签: shell awk

可能是一个简单的问题,但我没有找到答案。我有一个文件,其中多个记录用空行分隔。文件中的每个字段都用换行符分隔。我只想打印出整个第一条记录或整个第三条记录。

awk 'BEGIN{FS="";} {print $1}' output.txt

上面打印出第一条记录的每一行的第一个字母

awk 'BEGIN{FS="\n"; RS=""} {print $1}' output.txt

以上打印出第一条记录的第一个字段。

这似乎是一个简单的问题,但我似乎无法解决它。记录具有不确定数量的字段(行)。它们只是用空行分隔

A

好的,这是一个样本:

line1 record1
line2 record1
line3 record1
line4 record1

line1 record2
line2 record2
line3 record2
line4 record2
line5 record2

line1 record3

line1 record4
line2 record4

现在我想要整个第一条记录和整个第三条记录。

awk 'NR==1 || NR==3 {print $0}' output.txt
line1 record1
line3 record1

第一条记录的第一行和第三行。没有好处

awk 'NR==1 || NR==3' output.txt
line1 record1
line3 record1

第一条记录的第一行和第三行。没有好处

awk 'NR==1 || NR==3 {print $0}' output.txt
line1 record1
line3 record1

第一条记录的第一行和第三行。没有好处。

awk 'BEGIN{FS="\n"; RS=""} NR==1' output.txt
line1 record1
line2 record1
line3 record1
line4 record1

line1 record2
line2 record2
line3 record2
line4 record2
line5 record2

line1 record3

line1 record4
line2 record4

全部打印出来。没有好处

我只想要第一和第三条记录。 第一个是:

line1 record1
line2 record1
line3 record1
line4 record1

,第三个是:

line1 record3

好的,所以没有任何拼写似乎对我有用,我很困惑。这是shell输出:

$ awk -v RS= -v ORS='\n\n' 'NR ~ /^(1|3)$/' output.txt
line1 record1
line2 record1
line3 record1
line4 record1

line1 record2
line2 record2
line3 record2
line4 record2
line5 record2

line1 record3

line1 record4
line2 record4

$ cat output.txt
line1 record1
line2 record1
line3 record1
line4 record1

line1 record2
line2 record2
line3 record2
line4 record2
line5 record2

line1 record3

line1 record4
line2 record4
$

我很困惑为什么这不起作用。

这是我的系统和我正在使用的awk:

$ awk -V | head -1
GNU Awk 4.0.1
$ uname -a
Linux IEDUB2TJ5262 3.13.0-68-generic #111-Ubuntu SMP Fri Nov 6 18:17:06   UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ 

这里有什么我可能会遗失的吗?

A

3 个答案:

答案 0 :(得分:2)

这是 THE 惯用的awk方式来做你想做的事情,它适用于所有问题,而不仅仅是gawk:

$ awk -v RS= -v ORS='\n\n' 'NR ~ /^(1|3)$/' file
line1 record1
line2 record1
line3 record1
line4 record1

line1 record3

请参阅http://www.gnu.org/software/gawk/manual/gawk.html#Multiple-Line和Google awk paragraph mode

如果以上内容对您不起作用,那么您的输入文件就会出现问题(或者,您的awk很可能会被破坏)。

答案 1 :(得分:0)

awk 'BEGIN{FS="\n"; RS=""} NR==1' output.txt

打印第一条记录。

答案 2 :(得分:0)

NR

大括号之前的所有内容都称为限制。 它将确定是否将执行命令(括号内的所有内容)。 awk表示记录数,因此这意味着输出将仅限于第一个和第三个记录。

每个{print $0}程序只是限制命令的集合。

编辑: 实际上我刚刚意识到awk 'NR==1 || NR==3' output.txt 是默认操作,如果没有提供命令,这意味着:

awk 'BEGIN {RS='\n\n'} NR==1 || NR==3' output.txt

就足够了。

编辑:

在您对自己解释得更多之后,我建议:

{{1}}

它将所有内容都视为记录,并通过两个换行符彼此分开。