2012-10-17 36 views
1

我正在處理2個大型CSV文件。較小的是較大的子集。第一個字段是一個非唯一鍵,它是一個customerID。使用grep從文件中刪除行,其中的密鑰存在於另一個文件中

我想從中找到有場1作爲較小的文件相同的值越大文件中的所有行,然後找到原來的子集這一結果之間的增量,和。

然後,我想從已經在存在於增量域一個值的原始部分中刪除所有行。

換句話說:我想從具有其也存在於現有的大型原文件中的一行,而不是在較小的子集的custromerID原來的小部分中刪除任何行。

目前我正在做類似下面,我不明白爲什麼結果爲0

顯然有我的邏輯缺陷,而這顯然不這樣做最優雅的方式,所以請,我願意提供更好的方法。

文件:full.csv

,1052,tec101,UNIX 
,1052,ser303,UNIX 
,1052,backu2,UNIX 
,1052,sma114,UNIX 
,1052,appsup,UNIX 
,1052,emails,UNIX 
,1059,marygs,UNIX 
,39835,deepr2,UNIX 
,44536,hai499,UNIX 
,1274,lemo27,Windows 
,48567,wdanro,UNIX 
,81860,pro846,UNIX 
,1419,graphe,UNIX 
,83999,doerf1,UNIX 
,1551,taxtri,UNIX 
,1572,lodes4,UNIX 
,1603,wes244,Windows 
,102888,law642,UNIX 
,1700,au2960,UNIX 

文件:subset.csv

,1052,sma114,UNIX 
,1052,appsup,UNIX 
,1052,emails,UNIX 
,1059,marygs,UNIX 
,39835,deepr2,UNIX 
,44536,hai499,UNIX 
,1274,lemo27,Windows 
,48567,wdanro,UNIX 
,81860,pro846,UNIX 
,1419,graphe,UNIX 

我現在正在做什麼:

[[email protected] sandbox]$ wc -l * 
19 full.csv 
10 subset.csv 
29 total 
[[email protected] sandbox]$ cat subset.csv | awk -F, '{print ","$2","}' > subset_keys 
[[email protected] sandbox]$ grep -F -f subset_keys full.csv | wc -l 
13 
[[email protected] sandbox]$ grep -F -f subset_keys full.csv | head -n2 
,1052,tec101,UNIX 
,1052,ser303,UNIX 
[[email protected] sandbox]$ grep -F -f subset_keys full.csv > subset_keys_grep 
[[email protected] sandbox]$ cat subset_keys_grep | awk -F, '{print ","$2","}' | head -n2 
,1052, 
,1052, 
[[email protected] sandbox]$ cat subset_keys_grep | awk -F, '{print ","$2","}' | wc -l 
13 
[[email protected] sandbox]$ cat subset_keys_grep | awk -F, '{print ","$2","}' > keys_to_remove 
[[email protected] sandbox]$ grep -F -f keys_to_remove subset.csv | wc -l 
10 
[[email protected] sandbox]$ grep -F -f keys_to_remove subset.csv > lines_to_remove 
[[email protected] sandbox]$ grep -Fv -f lines_to_remove subset.csv | wc -l 
0 

我預期的結果應該是7,或,沒有統計,以下:

,1059,marygs,UNIX 
,39835,deepr2,UNIX 
,44536,hai499,UNIX 
,1274,lemo27,Windows 
,48567,wdanro,UNIX 
,81860,pro846,UNIX 
,1419,graphe,UNIX 

結果應該是7行的子集的有隻存在子集customerIDs,而不是其他地方也以完整的文件。

+0

我不太關注你正在嘗試做什麼。這可能有助於添加一個具體的縮短的例子,例如兩個有問題的文件,但是短的十行和長的二十個。然後指出您如何期望這些文件符合您提議的流程和結果。 – danfuzz

+0

好吧,我會試着想出一個更簡單的例子,實際的文件中有敏感信息,所以我不能只提供一個子集來玩。 –

+0

我簡化了示例 –

回答

1

試試這個。我修改你輸入「full.csv」刪除前3行:

$ cat full1.csv 
,1052,sma114,UNIX 
,1052,appsup,UNIX 
,1052,emails,UNIX 
,1059,marygs,UNIX 
,39835,deepr2,UNIX 
,44536,hai499,UNIX 
,1274,lemo27,Windows 
,48567,wdanro,UNIX 
,81860,pro846,UNIX 
,1419,graphe,UNIX 
,83999,doerf1,UNIX 
,1551,taxtri,UNIX 
,1572,lodes4,UNIX 
,1603,wes244,Windows 
,102888,law642,UNIX 
,1700,au2960,UNIX 

所以你的要求納入其中,1個鍵多次出現在你subset.csv文件的情況好一點。它假定subset.csv文件中的行順序與full.csv文件中的順序相匹配。如果不是這種情況,它只是需要一個調整分割字符串...

$ cat test.awk      
BEGIN{ FS="," } 
NR==FNR { key2full[$2] = key2full[$2] $0 ORS; next } 
{ key2subset[$2] = key2subset[$2] $0 ORS } 
END { 
    for (key in key2subset) { 
     if (key2subset[key] == key2full[key]) { 
     printf "%s", key2subset[key] 
     } 
    } 
} 
$ awk -f test.awk full1.csv subset.csv 
,1052,sma114,UNIX 
,1052,appsup,UNIX 
,1052,emails,UNIX 
,1419,graphe,UNIX 
,44536,hai499,UNIX 
,48567,wdanro,UNIX 
,1274,lemo27,Windows 
,81860,pro846,UNIX 
,39835,deepr2,UNIX 
,1059,marygs,UNIX 

我似乎已經通過上述修改的輸入文件運行我的命令造成了一些混亂。這對原本所以在這裏運行所針對的原始文件,以表明它不會產生所需的輸出:

$ cat full.csv 
,1052,tec101,UNIX 
,1052,ser303,UNIX 
,1052,backu2,UNIX 
,1052,sma114,UNIX 
,1052,appsup,UNIX 
,1052,emails,UNIX 
,1059,marygs,UNIX 
,39835,deepr2,UNIX 
,44536,hai499,UNIX 
,1274,lemo27,Windows 
,48567,wdanro,UNIX 
,81860,pro846,UNIX 
,1419,graphe,UNIX 
,83999,doerf1,UNIX 
,1551,taxtri,UNIX 
,1572,lodes4,UNIX 
,1603,wes244,Windows 
,102888,law642,UNIX 
,1700,au2960,UNIX 

$ awk -f test.awk full.csv subset.csv 
,1419,graphe,UNIX 
,44536,hai499,UNIX 
,48567,wdanro,UNIX 
,1274,lemo27,Windows 
,81860,pro846,UNIX 
,39835,deepr2,UNIX 
,1059,marygs,UNIX 
+0

我想找到在ELSEWHERE中存在的子集的子集的行,然後是子集。然後我想從子集中排除這些行。 –

+0

我編輯了我的答案,參見上文。 –

+0

謝謝,抱歉的混淆。 –

0

這應該做的伎倆:根據您的發言

grep -v -f subset.csv full.csv | awk -F, '{print ","$2",";}' >keys.csv 
grep -v -f keys.csv subset.csv 
0

那subset.csv中的所有記錄都存在於full.csv中,下面的內容應該在bash中工作。它首先使用uniq從full.csv中確定合格的CustomerID。這只是在與subset.csv的連接中進行過濾。

join -o 2.1,2.2,2.3,2.4 -v 2 -t, -1 2 -2 2 <(sort full.csv subset.csv | uniq -u | 
sort -k2,2 -t,) <(sort -k2,2 -t, subset.csv) 
相關問題