1

我正在尝试处理来自 FE 代码的数据文件,以删除由未收敛计算生成的答案。我的文件基本上是两列数字。我从 stackoverflow 中的另一个提问者那里找到了一个有用的 AWK 解决方案(解释这个重复行删除、订单保留、单行 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 编辑(抱歉,由于格式问题,我无法将其放在评论中):

鉴于海报评论“列 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  
4

2 回答 2

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
于 2013-04-04T18:30:53.107 回答
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.

于 2013-04-04T18:08:23.813 回答