Awk 将每一行向下移动到第二行

Awk 将每一行向下移动到第二行,awk,sed,Awk,Sed,我有以下示例文本: a b c x_y_ d e f x_y_ g h i x_y_ k l m x_y_ 我需要它的格式如下: x_y_ a b c x_y_ d e f x_y_ g h i x_y_ k l m 在bash中使用sed、awk或其他东西,我们如何做到这一点?第一个解决方案:请您尝试使用GNUawk测试并创建以下内容 awk -v RS="" -v FS="\n" '{for(i=2;i<=NF;i+=2){printf("%s\n",$i OFS $(i-1))}

我有以下示例文本:

a b c
x_y_
d e f
x_y_
g h i
x_y_
k l m
x_y_
我需要它的格式如下:

x_y_ a b c
x_y_ d e f
x_y_ g h i
x_y_ k l m
在bash中使用sed、awk或其他东西,我们如何做到这一点?

第一个解决方案:请您尝试使用GNU
awk
测试并创建以下内容

awk -v RS="" -v FS="\n" '{for(i=2;i<=NF;i+=2){printf("%s\n",$i OFS $(i-1))}}' Input_file
第二种解决方案:通过检查行号是否完全除以2,然后打印上一行和当前行的值。它还检查输入_文件中的总行数是否为奇数,然后也打印最后一行(通过检查标志(变量)的状态)

输出如下

x_y_ a b c
x_y_ d e f
x_y_ g h i
x_y_ k l m
对于sed:

sed -E 'N;s/(.*)\n(.*)/\2 \1/g' sample.txt
短管道:

tac file | paste -d ' ' - - | tac
另一个awk:

$ awk 'NR%2==0{print $0,p}{p=$0}' file
输出:

x_y_ a b c
x_y_ d e f
x_y_ g h i
x_y_ k l m
...
x_y_ g h i
x_y_ k l m
x y z
解释:

$ awk '
NR%2==0 {          # on every even numbered record
    print $0,p     # output current record and previous
}{
    p=$0           # buffer record for next round
}' file
更新

如果记录数为奇数(主要是由于同级压力:),则需要处理剩余的
x y z

$ awk 'NR%2==0{print $0,p}{p=$0}END{if(NR%2)print}' file
输出:

x_y_ a b c
x_y_ d e f
x_y_ g h i
x_y_ k l m
...
x_y_ g h i
x_y_ k l m
x y z
这可能适用于您(GNU-sed):

将奇数行编号的行保存在保留空间中,并将其附加到偶数行中,然后用空格替换换行符

另一个变化:

sed -n 'h;n;G;s/\n/ /p' file
从上面的答案可以看出,实现这一点的方法还有很多

这个怎么样:

parallel -N2 echo "{2} {1}" :::: file

请参阅以获取并行信息。

您可以使用
awk
并设置两个条件,如果
NR%2==1
打印奇数行,如果
NR%2==0
打印偶数行,我将添加我下次尝试的内容。这是真的,但由于它们是成对打印的,我假设记录数为偶数(读取:在我的频谱上不会发生)。好的,我会解决它。@RavinderSingh13更新中提到过你;谢谢。谢谢你清楚的回答和解释!
sed -n 'h;n;G;s/\n/ /p' file
parallel -N2 echo "{2} {1}" :::: file