用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
如果我有输入:
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