2009-09-17 82 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