我有以下示例文本:
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中的其他内容,我们如何完成此任务?
答案 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。