可能是一个简单的问题,但我没有找到答案。我有一个文件,其中多个记录用空行分隔。文件中的每个字段都用换行符分隔。我只想打印出整个第一条记录或整个第三条记录。
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
答案 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}}
它将所有内容都视为记录,并通过两个换行符彼此分开。