代码之家  ›  专栏  ›  技术社区  ›  Surya

从文件/grep中删除重复行

  •  3
  • Surya  · 技术社区  · 16 年前

    对不起,我的unix fu真的很弱,因为不使用:)。

    9 回复  |  直到 16 年前
        1
  •  1
  •   Evandro Coan    9 年前

    sort --key=8,19 --unique 应该会成功。如果顺序确实重要,但重复的行总是连续的, uniq -s 8 -w 11

        2
  •  8
  •   moonshadow    16 年前

    假设它们是连续的,并且您想删除后续的,以下awk脚本将执行此操作:

    awk -F'|' 'NR==1 {print;x=$2} NR>1 {if ($2 != x) {print;x=$2}}'
    

    它通过打印第一行并存储第二列来工作。然后,对于后续行,它会跳过存储值和第二列相同的行(如果不同,它会打印该行并更新存储值)。

    如果它们不是连续的,我会选择Perl解决方案,在那里你维护一个关联数组来检测和删除重复项——我会把它编码出来,但我3岁的女儿刚刚醒来,已经午夜了,她感冒了——如果我能挺过这晚,明天见:-)

        3
  •  3
  •   paxdiablo    16 年前

    awk '{for (i=1; i<=NF; i++) {x=0; for(j=i-1; j>=1; j--) {if ($i == $j){x=1} } if( x != 1){printf ("%s ", $i) }}print ""}' sent
    
        4
  •  2
  •   CharlesB Craig McQueen    14 年前

    sort -t '|' --key=10,10 -g FILENAME
    
    1. -t
    2. -g
        5
  •  1
  •   redtuna    16 年前

    Unix包含python,因此以下几行程序可能正是您所需要的:

    f=open('input.txt','rt')
    d={}
    for s in f.readlines():
      l=s.split('|')
      if l[2] not in d:
        print s
        d[l[2]]=True
    

    这将在不需要固定长度的情况下工作,即使相同的值不是邻居。

        6
  •  0
  •   Vidyadhar bhat    16 年前

    awk '{if($2!=05408736032}{print}' filename
    
        7
  •  0
  •   glenn jackman    16 年前

    awk -F\| '
        {count[$2]++} 
        END {for (x in count) {if (count[x] > 1) {print x}}}
    ' input.txt >input.txt.dups
    
    awk -F\| '
        NR==FNR {dup[$1]++; next}
        !($2 in dup) {print}
    ' input.txt.dups input.txt
    

    如果你使用bash,你可以省略临时文件:使用进程替换合并成一行:(深呼吸)

    awk -F\| 'NR==FNR {dup[$1]++; next} !($2 in dup) {print}' <(awk -F\| '{count[$2]++} END {for (x in count) {if (count[x] > 1) {print x}}}' input.txt) input.txt
    

    (呼!)

        8
  •  0
  •   ghostdog74    16 年前
    awk -F"|" '!_[$2]++' file
    
        9
  •  0
  •   helpermethod    16 年前