谁能帮我整理一下文件吗?我想根据下面使用 awk 的示例跳过每三行。
当前文件:
a
a
a
a
b
b
b
b
c
c
c
c
期望的输出:
a
b
c
答案1
$ awk 'NR%4==0 { print $0, "in line#", NR }' infile
a in line# 4
b in line# 8
c in line# 12
所以:
awk 'NR%4==0' infile
如果要打印第一行,请更改为awk 'NR%4==1'
,然后跳过接下来的三行。
答案2
使用 GNU sed
:
$ sed -n '1~4p' filename
a
b
c
答案3
使用awk
:
awk '{ print; getline; getline; getline}' file
getline
移动到文件的下一行。看这里。当我们什么都不做时,awk
移动到下一行。
在本例中使用了 3 次getline
,但没有对 进行任何操作awk
,因此跳过了三行。
其他用途getline
:
有趣的是,getline < "other_file"
该命令用于从其他文件读取一行。
getline
但通常不建议针对此类问题使用 of ,并且不建议以这种方式使用填充内置变量且不测试其结果,请参阅http://awk.freeshell.org/AllAboutGetline了解何时以及如何使用getline
.
或者awk
与数组一起使用:
awk '{arr[NR]=$0; }END{ for(i=1;i<=NR;i=i+3) print arr[i]}' file
这里 arr 在 NR(记录号,即行)上索引是在main
块中创建的。在END
块中,for 循环适合我们。
答案4
使用标准sed
:
sed -n 'N;N;N;P' file
对于从 读取的每一行file
,这会读取另外三行并将它们附加到原始行,并使用 分隔换行符N
。然后该P
命令打印原始行,直到第一个换行符。
或者:
sed -n 'p;n;n;n' file
这是类似的,但首先打印当前行,然后读取被丢弃的其他三行。