shell Awk:每两个字段写一个换行符

0vvn1miw  于 2023-02-13  发布在  Shell
关注(0)|答案(3)|浏览(424)

我的文档具有不同的行大小:

TITLE
NAME VALUE foo bar foo bar foo bar foo bar foo bar foo bar
NAME VALUE foo2 bar2 foo2 bar2
NAME VALUE foo3 bar3

我想删除标题和删除两个firsts字段,然后打印换行符每两个字段如下:

foo bar
foo bar
foo bar
foo bar
foo bar
foo2 bar2
foo2 bar2
foo3 bar3

我的输出实际上是:

foo bar foo bar foo bar foo bar foo bar foo bar
foo2 bar2 foo2 bar2
foo3 bar3

使用此代码:

awk -F' ' 'NR>1, NF>2 {
s = ""; for(i = 3; i <= NF; i++) s = s $i " "; print s
}' file_input.txt > file_output.txt

我没有找到解决办法。如果有人能帮助我。第一次对堆栈溢出!谢谢

vsmadaxz

vsmadaxz1#

我建议:

awk 'NR>1{ for(i=3; i<=NF; i=i+2){ print $i,$(i+1) } }' file

输出:

foo bar
foo bar
foo bar
foo bar
foo bar
foo bar
foo2 bar2
foo2 bar2
foo3 bar3

参见:8 Powerful Awk Built-in Variables – FS, OFS, RS, ORS, NR, NF, FILENAME, FNR

gz5pxeao

gz5pxeao2#

sed替代方案,与awk相比,可读性不佳。

$ sed -E '1d;s/\w+ \w+ //;s/( \w+) /\1\n/g' file

foo bar
foo bar
foo bar
foo bar
foo bar
foo bar
foo2 bar2
foo2 bar2
foo3 bar3
2skhul33

2skhul333#

另一个选项是使用gnu awkFPATFPAT具有匹配2个字段的模式,这2个字段由1个或多个空白字符分隔。
由于标题是单个字段:

awk -v FPAT='\\S+\\s+\\S+' '{for(i=2;i<=NF;i++) print $i}' file

产出

foo bar
foo bar
foo bar
foo bar
foo bar
foo bar
foo2 bar2
foo2 bar2
foo3 bar3

或者从第二行开始:

awk -v FPAT='\\S+\\s+\\S+' 'NR>1{for(i=2;i<=NF;i++) print $i}' file

相关问题