2013-08-27 54 views
-1

我有兩個這樣的文件;Bash腳本比較來自2個文件的值並從一個文件打印輸出值

File1中
114.4.21.198,cl_id=1J3W7P7H0S3L6g85900g736h6_101ps 114.4.21.205,cl_id=1O3M7A7Q0S3C6h85902g7b3h7_101pf 114.4.21.205,cl_id=1W3C7Z7W0U3J6795197g177j9_117p1 114.4.21.213,cl_id=1I3A7J7N0M3W6e950i7g2g2i0_1020h

文件2
cl_id=1B3O7M6C8T4O1b559i2g930m0_1165d
cl_id=1X3J7M6J0W5S9535180h90302_101p5
cl_id=1G3D7X6V6A7R81356e3g527m9_101nl
cl_id=1L3J7R7O0F0L74954h2g495h8_117qk
cl_id=1L3J7R7O0F0L74954h2g495h8_117qk
cl_id=1J3W7P7H0S3L6g85900g736h6_101ps
cl_id=1W3C7Z7W0U3J6795197g177j9_117p1
cl_id=1I3A7J7N0M3W6e950i7g2g2i0_1020h
cl_id=1Q3Y7Q7J0M3E62953e5g3g5k0_117p6

我想比較的文件1存在cl_id值,但對文件2不存在,從文件1打印出第一個值(IP地址)。

它應該是這樣的

114.4.21.198
114.4.21.205
114.4.21.205
114.4.21.213
114.4.23.70
114.4.21.201
114.4.21.211 120.172.168.36

我試過awk,grep diff,comm。但沒有接近。請告訴正確的命令來做到這一點。

謝謝

+0

請告訴我們你已經嘗試什麼,你的思路。這往往會得到更好的迴應,而不僅僅是要求解決方案。 – idfah

+0

「加入」命令是爲加入文件而構建的。 – dcaswell

+1

您的示例輸出包含不在示例輸入中的值。你需要解決這個問題。 – janos

回答

0

我不明白你如何得到你的輸出。 120.172.168.36從哪裏來。 這裏是一個解決方案比較

awk -F, 'NR==FNR {a[$0]++;next} !a[$1] {print $1}' file2 file1 
114.4.21.198 
114.4.21.205 
114.4.21.205 
114.4.21.213 
0

這似乎是你想要做什麼和可能的工作,有效地:

grep -Ff file2.txt file1.txt | cut -f1 -d, 

首先grep需要從file2.txt以線條爲圖案的使用,並且發現file1.txt中的匹配行。 -F將使用模式作爲文字字符串而不是正則表達式,儘管它與樣本無關。

最後,cut從輸出中獲取第一列,使用,作爲列分隔符,從而生成IP地址列表。

輸出與您的示例不完全相同,但樣本沒有任何意義,因爲它包含的文本不在任何輸入文件中。不知道這是你想要什麼或更多。

0

將兩個文件以字段分隔符=「,」輸入到AWK或perl中。如果有兩個字段,請將這些字段添加到字典/地圖/兩個數組/任何(「file1Lines」)。如果只有一個字段(這是文件2),請將其添加到set/list/array/whatever(「file2Lines」)。在讀取所有輸入之後:

循環遍歷file1Lines。對於每個元素,檢查關鍵部分是否存在於file2Lines中。如果不是,則打印值部分。到

1

一個正確的方法是這樣的:

grep -vFf file2 file1 | sed 's|,cl_id.*$||'

+0

這返回'114.4.21.205''不一樣reqested – Jotne

+0

@Jotne他說:「值存在於file1 **,但不是**存在於file2」。 – konsolebox

相關問題