【问题标题】:modifying duplicate line removing, order retaining, one-line awk command修改重复行删除,订单保留,单行awk命令
【发布时间】:2013-04-04 15:55:11
【问题描述】:

我正在尝试处理来自 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 编辑(抱歉,由于格式问题,我无法将其放在评论中):

鉴于张贴者评论“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  

【问题讨论】:

  • 您的文件排序了吗?通过 col1
  • 我的文件已对批次进行了排序 - 即我可能已经对许多节点的输出列表进行了排序,列 a 中的值可能对每个节点重复,但我只希望在它们相邻时删除重复项
  • 你应该在你的问题中做一个更好的例子,这样 SO 专家才能理解你真正想要什么。您当前的问题和示例误导了人们。
  • 我刚刚编辑了这个问题,因为我认为发布的示例输入/输出具有极大的误导性,因为发布者评论说“列 a 中的值可能对每个节点重复,但我只希望在以下情况下删除重复项它们是相邻的”。

标签: unix awk uniq


【解决方案1】:
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

【讨论】:

  • 感谢 Ed,这行得通。恐怕,愚蠢地,我试图在检查建议的回复之前回复 cmets 并编辑问题。
  • 如果您有满意的答案,请点击它旁边的复选标记,这样人们就知道不要浪费时间尝试提出替代方案。
  • 再次感谢,对不起新手错误。
【解决方案2】:

这是您可以使用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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-27
    • 2019-10-27
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 2018-10-14
    • 2019-02-25
    相关资源
    最近更新 更多