修改重复行删除,订单保留,单行awk命令

时间:2013-04-04 15:55:11

标签: unix awk uniq

我正在尝试处理FE代码中的数据文件,以删除未融合计算生成的答案。我的文件基本上是两列数字。我在stackoverflow(Explain this duplicate line removing, order retaining, one-line awk command

中找到了另一个提问者的有用AWK解决方案
awk '!x[$1]++' file > outFile

这仅打印一组行中第一行重复列a的值

但是在我的数据文件中,第二列中的正确值将是重复列a的最后一行,例如:

对于包含数据的文件:

a   b
a   c
a   d
b   a
c   d
e   f

awk '!x[$1]++' file > outFile生成

a   b
b   a
c   d
e   f

但我需要生成

a   d
b   a
c   d
e   f

是否可以通过修改awk之类的方法来实现这一目标?

Ed Morton的编辑(对不起,由于格式化,我无法将其置于评论中):

鉴于海报评论“ colum a中的值可能会为每个节点重复,但我只希望在它们相邻时删除重复”我认为他的实际样本输入和预期输出将是像这样的东西:

输入:

a   b
a   c
a   d
b   a
c   d
a   x
a   y
e   f

输出:

a   d
b   a
c   d
a   y
e   f

对于OP - 如果我错了,请删除上面的内容。

编辑:

抱歉,我试图简化我的问题,但显然未能充分地这样做。我不希望发布一个完整的文件,因为这些是几个mb的txt。每个文件包含按节点结果输出的数据(至少数百个节点)。每个节点数据都以标题部分开头:

                         S:Min Principal (
                         Avg: 75p) PI: BLA
                         DE_MERGE-1 N: 143
              X                  6        

每个标题部分后面是两列列表。第一列是时间,第二列是该时间点和节点的计算值。然而,当计算不收敛时,可能存在给定时间戳的重复条目。每次的最后一个条目是正确的(收敛)结果。时间可能(但可能不)在节点之间重复,每个节点应保留一行。

下面是文件中一个节点的示例输出。此文件只有几次重复,可以手动编辑。在其他节点,大多数时间可能出现10-15次 - 重复次数变化 - 与预期的时间点数一样。

            0.                 0.         
            2.E-03            -4.43054    
            4.5E-03           -4.43195    
           10.125E-03         -4.43515    
           22.7813E-03        -4.44235    
           51.2578E-03        -4.45856    
          115.33E-03          -4.49509    
          259.493E-03         -4.57752    
          583.859E-03         -4.76425    
            1.31368           -5.19031    
            2.95578           -6.24656    
            6.65051           -8.77117    
           14.9637           -11.385      
           32.4455           -11.385      
           52.4455           -11.385      
           72.4455           -11.385      
           92.4455           -11.385      
          100.               -11.385      
          100.               -11.385      
          102.               -11.385      
          105.75             -11.385      
          114.188            -11.385      
          133.172            -11.385      
          175.887            -11.385      
          271.995            -11.6325     
          458.493            -27.0386     
          600.               -32.1938     
          600.               -32.1938     
          600.2              -32.1939     
          600.575            -32.1943     
          601.419            -32.1938     
          603.317            -32.192      
          607.589            -32.1879     
          617.2              -32.1759     
          638.824            -31.9507     
          687.479            -31.311      
          796.952            -29.3312     
            1.04327E+03      -27.8592     
            1.59748E+03      -25.3054     
            2.84445E+03      -21.0816     
            4.84445E+03      -20.8229     
            6.84445E+03      -20.8229     
            8.84445E+03      -20.8229     
           10.8444E+03       -20.8229     
           12.6E+03          -20.8229     
           12.6E+03          -20.8229     
           12.6002E+03       -20.8229     
           12.6006E+03       -20.8229     
           12.6014E+03       -20.8229     
           12.6033E+03       -20.8229     
           12.6076E+03       -20.8229     
           12.6172E+03       -20.8229     
           12.6388E+03       -20.8229     
           12.6875E+03       -19.8705     
           12.797E+03        -19.8283     
           12.9955E+03       -20.3811     
           13.1955E+03       -20.6489     
           13.3955E+03       -23.6448     
           13.5955E+03       -23.9506     
           13.7955E+03       -27.1146     
           13.9955E+03       -28.8359     
           14.1955E+03       -24.484      
           14.3955E+03       -11.7371     
           14.42E+03         -11.4293  

2 个答案:

答案 0 :(得分:2)

awk 'NR>1 && $1!=p{print s} {p=$1;s=$0} END{print s}' file 
a   d
b   a
c   d
a   y
e   f

答案 1 :(得分:1)

这是您可以先使用uniq而不先使用sort的情况之一。如果第一个字段是固定宽度,您可以简单地执行:

uniq -w1 file
a   b
b   a
c   d
a   x
e   f

如果它不是固定宽度,请使用旧的rev技巧:

rev file | uniq -f1 | rev
a   b
b   a
c   d
a   x
e   f

注意:将 EdMorton 的代表输入用作file

相关问题