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(请参阅)更长、更复杂,而且更容易出错,因此发布它变得毫无意义。