2009-09-17 83 views
2

我想删除其中所有的第二列05408736032相同除去重复行

0009300所有行| 05408736032 | 89 | 01 | 001 | 0 | 0 | 0 | 1 | NNNNNNYNNNNNNNNN | ASDF | 0009367 | 05408736032 | 89 | 01 | 001 | 0 | 0 | 0 | 1 | NNNNNNYNNNNNNNNN | adff |

这些行不是连续的。它很好,可以删除所有的行。我不必保留其中一个。

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

+0

daveb - 为什么“sort”标签? – mob 2009-09-17 17:45:37

+0

Double发布:http://serverfault.com/questions/66301/removing-duplicate-lines-from-file-with-grep – 2009-09-17 19:18:53

+0

@ Dennis双重发布有什么问题?我不明白。 – Surya 2009-09-17 20:39:23

回答

1

如果列没有固定的宽度,你仍然可以使用排序:

sort -t '|' --key=10,10 -g FILENAME 
  1. -t标志将设置分隔符。
  2. -g仅用于自然数字排序。
+0

使用'-k'获得最大(POSIX兼容)可移植性(并且没有'=')。另外,为什么10,10为第二列? – 2009-09-17 17:41:50

+0

两个原因。一,当你使用-t排序将使用不是字符的字段(即不是更高的数字)。二,结束(,10)被指定为使用该点的其余部分停止排序。 – daveb 2009-09-17 20:26:35

2

假设他们是连续的和要删除后续的,下面的awk脚本将做到这一点:

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

它通过印刷的第一行和存储的第二列。然后对于后面的行,它跳过存储值和第二列相同的地方(如果不同,则打印行并更新存储的值)。

如果它们不是连续的,我会选择一个Perl解决方案,在那里你维护一个关联数组来检测和删除重复项 - 我会编写它,但是我的3yo女儿刚刚醒来,这是午夜,她感冒了 - 明天再见,如果我在夜里生存下来的话:-)

+0

哦,它们不是随后的 – Surya 2009-09-17 16:28:40

8

如果你所有的输入数据的格式如上 - 即固定大小的字段 - 并且输出中行的顺序无关紧要,sort --key=8,19 --unique应该做的伎俩。如果订单确实重要,但重复的行总是连续的,uniq -s 8 -w 11将起作用。如果字段不是固定宽度,但重复的行总是连续的,Pax的awk脚本就可以工作。在最常见的情况下,我们可能会看到一些稍微复杂的事情,但对于一行代码来说却是如此。

1

的Unix包括蟒蛇,所以下面几派可能正是你所需要的:

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 

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

+0

这不会删除所有具有重复值的行 - 它将打印第一个实例。确实是 – 2009-09-17 17:54:46

+0

。问题是“可以移除所有实例” - 因此移除所有不是必需的,可以留下每个代表的代表。至少,这就是我的理解。 – redtuna 2009-09-17 19:56:37

0

这个awk将只打印那些行,其中第二列是不是05408736032

awk '{if($2!=05408736032}{print}' filename 
+0

你需要报价吗?它是否因为前导零而被解释为八进制数?或者它不会被解释为八进制,因为出现了8个(当然八进制无效),但是如果数字中没有8或9,那该怎么办? – 2009-09-17 17:40:51

0

注意到两个超过输入文件:1)找到重复的值,2)删除它们

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 

(phew!)

0

把线散列,使用线键和值,然后遍历哈希(这应该在几乎任何编程语言,AWK,Perl等)

2

这是用于删除行中重复单词的代码..

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