如何使用 awk 跳过每三行

如何使用 awk 跳过每三行

谁能帮我整理一下文件吗?我想根据下面使用 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

这是类似的,但首先打印当前行,然后读取被丢弃的其他三行。

相关内容