2017-03-06 96 views
0

我需要一些幫助來找到使用shell腳本的2個文件之間的區別。在shell腳本中比較2個文件

第一個文件是一個簡單的文本文件 - FILE1.TXT

A1 B1 
C2 D2 
E3 F3 
G4 H4 
I5 J5 
K6 L6 

另一種是一個CSV文件 - File2.csv

"Line1";"BB";"ZZ";"12";"A1 B1";"190";"123";"1000";"qw1" 
"Line2";"KH";"YY";"78";"K6 L6";"45";"546";"234";"sgsd4" 
"Line3";"JJ";"LY";"77";"G4 H4";"32";"12";"213";"sdg12" 

我的要求是找到,如果每一行在File1.txt存在於File2.csv(在第5列)如果不是那麼寫它到一個單獨的文本文件說,Result.txt

因此預期結果在的Result.txt會 -

C2 D2 
E3 F3 
I5 J5 

我一直在試圖用grep和差異,甚至使用awk。但到目前爲止無法得到所需的結果

@triplee @ ghoti。

好的同意,可能是我應該給我使用的命令的例子。
在使用awk不同的時間我是 -
使用$ 1而不是$ 0或
未使用{}打印或
與選項-F「;」而不是-F'「;」'或。
我試着'NR == FNR {c [$ 1] ++; next}; c [$ 5]> 0'。

我試過使用通訊23。
有一些例子,我現在不記得了,使用grep我各種網站上找到,但被印刷在FILE1.TXT

+2

即使不起作用,您也應該向我們展示您所嘗試過的內容。如果你的嘗試完全沒有希望,那麼需要一種不同的答案,如果你在那裏99%。 – tripleee

+0

對tripleee的評論+1。你有什麼嘗試?我們大多數人都很樂意幫助你改進自己的技藝,但不願意擔任短期無償編程人員。在[MCVE](http://stackoverflow.com/help/mcve)中向我們展示您的工作,您期待的結果以及您獲得的結果,我們將幫助您弄清楚。 – ghoti

回答

3
awk -F'";"' 'FNR==NR {a[$0];next} 
         {if ($5 in a) delete a[$5]} 
      END  {for (i in a) {print i}}' file1 file2 

所有的值,我們存儲第一個文件的行。解析第二個時,我們刪除在特定列中找到的任何一個。最後,我們打印出陣列中剩下的部分。

,或者我們可以改變文件的順序(這可能更快):

awk -F'";"' 'FNR==NR {a[$5];next} !($0 in a) {print $0}' file2 file1 
+0

第二個選項已經運行並且相當快。我之前正在嘗試使用類似的awk命令,認爲我可能犯了一個小錯誤。 –

0

我這樣做:

grep -vf <(grep -Po '[A-Za-z]\d [A-Za-z]\d' File2.csv) File1.txt 

在括號內的命令(grep -Po '[A-Za-z]\d [A-Za-z]\d' File2.csv)會從csv文件模式(我假設他們總是在上面的格式:「LetterNumberSpaceLetterNumber」)。它的輸出是:然後

A1 B1 
K6 L6 
G4 H4 

第二grep的檢查,如果這些模式中FILE1.TXT和-v選項反轉它,只顯示非匹配線:

C2 D2 
E3 F3 
I5 J5 

PS:注意,-P選項是使用Perl兼容的正則表達式,因此請檢查它是否可用於您正在使用的grep版本。

0

隨着cutsort & uniq

cut -d'"' -f 10 file2.txt | sort - file1.txt | uniq -u 

輸出:

C2 D2 
E3 F3 
I5 J5 

注:鑑於FILE2.TXT的格式,在cut分隔符和字段可能是 ';' 和'5',但使用'"'和'10' aves額外的步驟過濾掉file2.txt的雙引號。