Bash 每隔一行与awk交换一次
如果我有意见:Bash 每隔一行与awk交换一次,bash,awk,Bash,Awk,如果我有意见: line1 line2 line3 line4 line5 line6 如何使用awk打印 line2 line1 line4 line3 line6 line5 我觉得awk可能是最好的工具,因为我希望从流中执行此操作,但是bash或其他方法会更好吗?类似于 awk 'NR%2{prev=$0; next} {print ; print prev}' 测试 $ awk 'NR%2{prev=$0; next} {print ; print prev}' input lin
line1
line2
line3
line4
line5
line6
如何使用awk
打印
line2
line1
line4
line3
line6
line5
我觉得awk
可能是最好的工具,因为我希望从流中执行此操作,但是bash或其他方法会更好吗?类似于
awk 'NR%2{prev=$0; next} {print ; print prev}'
测试
$ awk 'NR%2{prev=$0; next} {print ; print prev}' input
line2
line1
line4
line3
line6
line5
差不多
awk 'NR%2{prev=$0; next} {print ; print prev}'
测试
$ awk 'NR%2{prev=$0; next} {print ; print prev}' input
line2
line1
line4
line3
line6
line5
尽管OP已经接受了答案,我还是要补充一句话:
sed -n '1~2{h;n};p;g;p' file
带有seq
kent$ seq 6|sed -n '1~2{h;n};p;g;p'
2
1
4
3
6
5
尽管OP已经接受了答案,我还是要补充一句话:
sed -n '1~2{h;n};p;g;p' file
带有seq
kent$ seq 6|sed -n '1~2{h;n};p;g;p'
2
1
4
3
6
5
您也可以为此使用
sed
:
sed -n 'h;n;p;g;p'
工作原理:使用
h
我们将当前行存储在“保留空间”,使用n
移动到下一行,使用p
打印,使用g
检索保存的行,然后依次打印(p
)。您也可以使用sed
进行此操作:
sed -n 'h;n;p;g;p'
工作原理:使用
h
我们将当前行存储在“保留空间”,使用n
移动到下一行,使用p
打印,使用g
检索保存的行,然后依次打印(p
)。但是要小心使用getline
:如果使用不当,它可能会咬人
awk '{f=$0;getline;print $0 RS f}' file
line2
line1
line4
line3
line6
line5
这里是另一个
awk
。但是要小心使用getline
:如果使用不当,它可能会咬人
awk '{f=$0;getline;print $0 RS f}' file
line2
line1
line4
line3
line6
line5
这是一样的,只有那一个被扩展了。这是一样的,只有那一个被扩展了。因为我不喜欢
next
另一个awk'!(NR%2){print;print x}{x=$0}'
@JID如果你在打高尔夫,使用sed可以缩短。因为我不喜欢next
替代awk'!(NR%2){print;print x}{x=$0}'
@JID如果你在打高尔夫,使用sed可能会短一些;NGp'@glennjackman你完全正确,三思而后行,1~2
没有多大意义,可以简单一点:sed-n'h;NGp'
@glennjackman你完全正确,三思而后行,1~2
没有多大意义,可以用G
代替p;g
可以用g
代替p;g
wrt声明如果使用不正确,它可能会咬人。
为什么不干脆显示它使用正确()?我认为答案可能是因为生成的代码比不使用getline(请参阅)的代码更长、更复杂,而且更容易出错,因此发布它变得毫无意义。wrt声明如果使用不正确,它可能会有影响。
为什么不简单地显示正确使用的代码()?我认为答案可能是因为结果代码比不使用getline(请参阅)更长、更复杂,而且更容易出错,因此发布它变得毫无意义。