2011-10-05 106 views
3

我有很多(近100)大的CSV文件與第一列sellID。我知道一些sellID在2個或更多文件中重複2次或更多次。用grep可能找到所有這個重複的sellID(create map sellID-file_name)?或者爲此目的存在另一個開源應用程序?我的操作系統 - CentOS。grep是否允許搜索重複?

+0

你能否澄清一下你的問題。你需要在許多文件中找到某些字符串的所有重複項? –

+0

整個記錄是否重複,還是某些行具有相同的sellID但記錄的其餘部分不同? –

+0

CSV =逗號分隔值。字符串中的第一個字段有時會在不同文件中複製。我只需要找到這些行。 – user710818

回答

1

這裏是一個非常簡單的,有些粗糙awk腳本,你似乎是描述如何做到八九不離十的東西:

#!/usr/bin/awk -f 

{ if ($1 in seenbefore) { 
    printf("%s\t%s\n", $1, seenbefore[$1]); 
    printf("%s\t%s\n", $1, FILENAME); 
    } 
    seenbefore[$1]=FILENAME; 
    } 

正如你所希望揣所有我們正在做的是建立每個值的關聯數組你在第一列/字段中找到(在BEGIN特殊塊中設置FS以更改輸入字段分隔符...以獲得簡單無用的CSV支持形式)。當我們遇到任何重複的時候,我們會打印出這個文件,我們之前看到它的文件和當前的文件名。無論如何,我們隨後使用當前文件的名稱添加/更新數組。

使用更多的代碼,您可以存儲和打印每行的行號,將文件名/行號元組附加到列表中,並將所有輸出移動到END塊,您可以用更簡潔的格式對其進行彙總,等等。

對於我個人轉而使用Python的數據類型更豐富的地方(實際列表和元組,而不必將它們連接成字符串或內置數組)以及我可以訪問更多功能(一個實際的CSV解析器,可以處理各種引用的CSV和其他分隔符,並且生成排序結果非常簡單)。

但是,這應該有希望讓你走上正確的軌道。

1

試試這個:

#Save duplicate columns 
find path -type f -name '*.csv' -execdir cut -d, -f1 {} \+ | sort | uniq -d \ 
    > duplicate-ids.log 
#List duplicate records 
find path -type f -name '*.csv' -execdir grep -F -f duplicate-ids.log {} \+ 

注:我沒有測試它。

1

另一個答案:

如果您SellID的長度是固定的(比如6個字符),可以使用

sort data.txt | uniq -w 6 -D 

這將打印出不唯一的線

如果所有你想要做的就是自動刪除重複行(保留第一行),請嘗試:

sort -u --key=1,1 data.txt