2013-04-04 115 views
1

我正在尝试处理FE代码中的数据文件以删除未收敛计算生成的答案。我的文件基本上是两列数字。我已经发现从另一询问器在计算器的有用AWK溶液(Explain this duplicate line removing, order retaining, one-line awk command修改重复行删除,订单保留,单行awk命令

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

这仅打印其中重复

然而柱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来做到这一点?

编辑由爱德·莫顿(对不起,我不能把这个注释由于格式):

鉴于海报评论说,“在的科拉姆值的可重复的每个节点,但只有我希望当他们相邻“我认为他的真实样品的输入和输出预计会是这样的删除重复:

输入:

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 
+0

是你的文件分类?通过col1 – Kent 2013-04-04 16:11:21

+0

我的文件已排序的批次 - 即我可能已排序的许多节点的输出列表,列中的值可能会重复每个节点,但我只希望删除重复时,他们是相邻的 – user2245653 2013-04-04 16:49:50

+1

你应该做一个更好的例子你的问题,以便SO专家能够理解你真正想要的东西。你目前的问题和例子是误导人。 – Kent 2013-04-04 17:41:14

回答

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 
+0

谢谢埃德,这个工程。我害怕,愚蠢地,我试图回答评论,并在检查建议的回复之前编辑问题。 – user2245653 2013-04-08 11:01:43

+0

如果您有一个满意的答案,请点击旁边的复选标记,以便人们不会浪费时间试图提出替代方案。 – 2013-04-08 14:10:28

+0

再次感谢,对不起新手错误。 – user2245653 2013-04-08 16:07:51

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