Linux - 仅使用awk翻转最后一行底线

时间:2015-11-08 18:09:03

标签: linux bash awk lines flip

我们目前正在学习一些awk命令来操作/重新排列文件上的文本。

我们的原始文字就像这样...... 1998年

    Ford,mondeo,1998,5800
    ford,fiesta,1994,4575
    Chevy,impala,1998,1000
    Plymouth,Fury,1992,2000
    Dodge,charger,1989,5950
    Ford,F150,1991,1450

它要求我们重新排列我已经做过的列(第一部分)。 但同时翻转底部两行(第二部分),使其看起来像这样

1998 5800 Ford mondeo
1994 4575 ford fiesta
1998 1000 Chevy impala
1992 2000 Plymouth Fury
1991 1450 Ford  F150
1989 5950 Dodge charger

再一次,我得到了顺序和间距,但我如何切换底部两行(或翻转它们)。顺便说一下,这只能用awk来完成。

2 个答案:

答案 0 :(得分:3)

以下代码切换文件的最后两行:

awk '{array[NR%3]=$0; 
    if(NR>2){print array[(NR+1)%3]}}
    END{print array[NR%3]; 
        print array[(NR-1)%3]}' test

为此,我们将最后三行存储在一个数组中。我们只在读取下一行之后的行时打印一行。最后,我们从数组中取出最后两行,反转顺序并打印出来。

代码的更详细说明
我们将当前行($0)的内容存储在一个数组中。因为我们只需要保持最后三行的轨道上读,我们的数组的索引可以被限制到值0,1,和2。通过使用模运算达到这个(NR % 3)。
到达第三行时,我们打印最后一行(if(NR>2)...)。这是保存,因为在这种情况下,阵列中仍然有两行我们可以单独处理 到达文件末尾(END{...})时,我们以相反的顺序打印最后两行 我们为什么使用NR%3(而不是NR%2)?如果输入文件中只有两行,则必须在END - 块中进行打印,而不是之前!

答案 1 :(得分:1)

这将交换最后两行,并为其他行省略打印

$ tac cars | awk 'NR==1{getline one} 
                  NR==2{print; print one} 
                   NR>2{print "omitted"}' | tac  
omitted
omitted
omitted
Plymouth,Fury,1992,2000
Dodge,charger,1989,5950

您可以添加格式。同样可以在tac块中没有END逻辑。

更新:awk only解决方案:在内存中保留两行,完成后按相反的顺序打印

$ awk 'NR>2{print pp} 
           {pp=p;p=$0} 
        END{print p;print pp}' car 

Ford,mondeo,1998,5800                                                                                          
ford,fiesta,1994,4575                                                                                          
Chevy,impala,1998,1000                                                                                         
Plymouth,Fury,1992,2000                                                                                        
Ford,F150,1991,1450                                                                                            
Dodge,charger,1989,5950