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

时间:2019-03-09 10:47:11

标签: 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

使用sed,awk或bash中的其他内容,我们如何完成此任务?

6 个答案:

答案 0 :(得分:3)

另一个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

解释:

$ 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_ g h i
x_y_ k l m
x y z

答案 1 :(得分:1)

使用sed:

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

答案 2 :(得分:1)

一条简短的管道:

tac file | paste -d ' ' - - | tac

答案 3 :(得分:1)

$ awk 'NR%2{s=$0; next} {print $0, s}' file
x_y_ a b c
x_y_ d e f
x_y_ g h i
x_y_ k l m

答案 4 :(得分:0)

第一个解决方案: 。能否请您尝试使用GNU awk进行跟踪,测试和创建。

awk -v RS="" -v FS="\n" '{for(i=2;i<=NF;i+=2){printf("%s\n",$i OFS $(i-1))}}' Input_file

OR(带有print):

awk -v RS="" -v FS="\n" '{for(i=2;i<=NF;i+=2){print $i,$(i-1)}}' Input_file

第二种解决方案: :检查行号是否被2完全除,然后打印前一行和当前行的值。它还检查Input_file中的总行数是否为奇数,然后也打印最后剩余的行(通过检查标志(变量)的状态)。

awk 'prev && FNR%2==0{print  $0 OFS prev;prev="";next} {prev=$0} END{if(prev){print prev}}'  Input_file

输出如下。

x_y_ a b c
x_y_ d e f
x_y_ g h i
x_y_ k l m

答案 5 :(得分:0)

这可能对您有用(GNU sed):

sed '1~2{h;d};G;s/\n/ /' file

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

另一种变化:

sed -n 'h;n;G;s/\n/ /p' file

还有更多方法可以实现这一点,如上面的答案所示。

如何?

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

请参阅here