2011-04-29 227 views
0

我在刪除重複項時遇到了問題(我在Shell中不太好)這裏是情況 - 應用程序創建一個扁平的文本文件。每行是一條記錄,每個字段由分隔符「〜|」(不包括引號)分隔。因此,記錄看起來像 -Shell腳本重複記錄

Field1~|Field2~|Field3~|Field4~|Field5~|Field6~|Field7~| 

有一些記錄是重複的。重複的記錄是由field-Field2的值決定的。如何編寫shell腳本/ awk/sed以基於此標準刪除重複記錄?然後腳本必須將輸出寫入其他文件。 我可以在應用程序本身做到這一點,但由於性能問題無法完成。 感謝您的幫助。

輸入文件

Field1~|ABA~|Field3~|Field4~|Field5~|Field6~|Field7~| 
Field1~|PQR~|Field3~|Field4~|Field5~|Field6~|Field7~| 
Field1~|XYZ~|Field3~|Field4~|Field5~|Field6~|Field7~| 
Field1~|ABA~|Field3~|Field4~|Field5~|Field6~|Field7~| 
Field1~|RST~|Field3~|Field4~|Field5~|Field6~|Field7~| 
Field1~|PQR~|Field3~|Field4~|Field5~|Field6~|Field7~| 

輸出應該是─

Field1~|ABA~|Field3~|Field4~|Field5~|Field6~|Field7~| 
Field1~|PQR~|Field3~|Field4~|Field5~|Field6~|Field7~| 
Field1~|XYZ~|Field3~|Field4~|Field5~|Field6~|Field7~| 
Field1~|RST~|Field3~|Field4~|Field5~|Field6~|Field7~| 

(的記錄順序並不重要。)

+0

顯示此輸入文件的更具體示例/示例。如果字段2有很多重複項,你的輸出應該如何。 ? – ghostdog74 2011-04-29 07:52:21

+0

輸入文件可能有很多重複項。在這種情況下,只有一個唯一記錄將寫入輸出文件。 – 2011-04-29 07:56:21

回答

2

不知道如果我理解正確的問題,而是你在找什麼?:

test.txt:

Field1~|Field2~|Field3~|Field4~|Field5~|Field6~|Field7~| 
foo~|Field2~|bar~|Field4~|Field5~|Field6~|Field7~| 
Field1~|foobar~|Field3~|Field4~|Field5~|Field6~|Field7~| 

調用sort

sort --field-separator="~" --key 2,2 --unique test.txt 

結果:

Field1~|Field2~|Field3~|Field4~|Field5~|Field6~|Field7~| 
Field1~|foobar~|Field3~|Field4~|Field5~|Field6~|Field7~| 
+0

Thanks.Input file Field1〜| ABA〜| Field3〜| Field4〜| Field5〜| Field6〜| Field7〜| |字段1〜|〜PQR |字段3〜|〜字段4 |字段5〜|〜字段6 |字段7〜|字段1〜|〜XYZ |字段3〜|〜字段4 |字段5〜|〜字段6 |字段7〜|字段1〜|〜ABA |字段3〜|〜字段4 |字段5〜|〜字段6 |字段7〜|字段1〜|〜RST |字段3〜|〜字段4 |字段5〜|〜字段6 |字段7〜|字段1〜|〜PQR |字段3〜|〜字段4 |字段5〜|〜字段6 |字段7〜|輸出應該是:Field1〜| ABA〜| Field3〜| Field4〜| Field5〜| Field6〜| Field7〜| |字段1〜|〜PQR |字段3〜|〜字段4 |字段5〜|〜字段6 |字段7〜|字段1〜|〜XYZ |字段3〜|〜字段4 |字段5〜|〜字段6 |字段7〜|字段1〜|〜RST |字段3〜|〜字段4 |字段5〜|〜字段6 |字段7〜| – 2011-04-29 08:02:03

+0

排序方法適用於您的測試用例。我保留我的例子,因爲它說明在決定兩行是否相等時只考慮第二個字段。 – 2011-04-29 08:36:04

1

如果要刪除所有重複

nawk -F'~|' '{a[$2]++;b[$2]=$0}END{for(i in a) if (a[i]==1){print b[i]} }' file 

如果你想保持只有一個版本複製的記錄

nawk -F'~|' '!a[$2]++' file 
+0

Thanks.but第二個給出了語法錯誤(我正在使用Solaris),第一個沒有顯示任何結果。有記錄-ABCD〜| PQRS〜| 1234〜| BLR PQRS〜| GSG〜| 7281 〜| KLP NPQS〜| NCX〜| 9192〜| VBN – 2011-04-29 08:23:00

+1

如果您使用Solaris,請使用'nawk'。放在字段分隔符中。我忘了那個。此外,更新您問題中的所有重要信息,而不是在評論中。 – ghostdog74 2011-04-29 08:26:06