歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 文件比較(grep/comm/awk)

Linux 文件比較(grep/comm/awk)

日期:2017/2/28 16:14:59   编辑:Linux教程

首先描述一下這個問題:比如兩個文件file1和file2,刪除兩個文件中共同的部分,留下兩個文件中獨自有的部分。在網上找到一篇解決的答案,地址在這裡http://www.linuxidc.com/Linux/2011-05/36171p2.htm。這裡提到三種方法,但是沒有給具體的解釋。

方法一:使用grep
grep -v -f file1 file2 && grep -v -f file2 file1
grep命令的詳細使用方法,可以參考man,這裡有一個簡單實用的介紹:http://www.linuxidc.com/Linux/2011-05/36171p3.htm。在方法一中,用到了兩個參數。參數-v,表示invert match,即反向匹配,輸出沒有匹配上的項。參數-f,表示從文件中讀取匹配模板(pattern)。方法一中的前一部分,在文件file1中匹配模板,來反向匹配文件file2中的內容,即輸出文件file2中,在file1中沒有的內容。後面的一部分同理可得,輸出文件file1中,在file2中沒有的內容。

方法二:實用comm
comm -3 file1 file2
這個方法看起來最簡單。命令comm的功能就是,逐行比較兩個排好序的文件,默認輸出有三列:只在file1中有的行、只在file2中有的行、在file1和file2中共有的行。有參數-1 -2 -3,分別來抑制輸出對應的列。例如在我們的方法二中,實用-3參數,不輸出file1和file2中共有的部分。即能達到我們本文的目的。
但是注意到,comm比較排好序的兩個文件,comm在處理文件的時候,首先要查看文件是否有序,例如file1和file2的內容如下:

$cat file1
line1
line2
line3

$cat file2
line0
line1
line3
line2
調用前面方法二的命令的時候,就會提示file2文件時無序的,輸出的結果如下:

$ comm -3 file1 file2
line0
line2
comm: file 2 is not in sorted order
line2
如果使用--nocheck-order參數,不進行有序性檢測,結果如下:

$ comm -3 --nocheck-order file1 file2
line0
line2


line2

從這個結果中我們可以看到,這還是不是我們真正想要的結果。這裡可體現comm的另一個特征,就是逐行比較。它是對file1和file2進行逐行往下的比較,檢測是否相同。所以,在用comm的時候,要根據具體的情況進行分析了。

方法三:使用awk
awk '{print NR, $0}' file1 file2 |sort -k2|uniq -u -f 1|sort -k1|awk '{print $2}'
或者:
awk '{print $0}' file1 file2 |sort|uniq -u
awk命令的使用,聽牛人說可謂博大精深,我也沒有太搞清楚。這裡只是使用了一些簡單的功能。下面以我自己的理解來解釋一下上面的shell代碼。awk就是文本的解釋器和過濾器。awk把每一行看成是一個記錄(record),每個記錄使用分隔符(默認是空格)把每條記錄分成若干域。awk內置參數$0表示整行,$1、$2...分別表示各域,內置參數NR,表示記錄的計數,awk '{print NR, $0}' file1 file2表示依次讀取file1 file2,打印出每行,並且在前面添加行號。

命令sort,就是對行進行排序,參數-k表示根據各行的第幾個參數關鍵字開進行排序,這裡的-k2表示根據第二個關鍵字開始進行排序。

命令uniq,進行報告或者忽略重復的行,參數-u,表示只是打印出唯一的行(unique lines),-f表示忽略的每行的前n個域的比較。

Copyright © Linux教程網 All Rights Reserved