用awk交换每隔一行

Interchange every other line with awk

如果我有输入:

line1
line2
line3
line4
line5
line6

如何使用awk打印

line2
line1
line4
line3
line6
line5

我觉得 awk 可能是最好的工具,因为我想从流中执行此操作,但是 bash 或其他更好的方法吗?

类似

awk 'NR%2{prev=[=10=]; next} {print ; print prev}'

测试

$ awk 'NR%2{prev=[=11=]; next} {print ; print prev}' input
line2
line1
line4
line3
line6
line5

尽管 OP 已经接受了一个答案,我还是会添加这个 sed 一行:

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 我们将当前行存储在 "hold space" 中,使用 n 移动到下一行,使用 p 打印它,使用 g 检索保存的行,然后依次打印(再次 p)。

这是另一个 awk。但要小心 getline:如果使用不当,可能会咬人。

awk '{f=[=10=];getline;print [=10=] RS f}' file
line2
line1
line4
line3
line6
line5