目錄
方法一:使用grep
方法二:實用comm
方法三:使用awk
首先描述一下這個問題:比如兩個檔案file1和file2,刪除兩個檔案中共同的部分,留下兩個檔案中獨自有的部分
grep -v -f file1 file2 && grep -v -f file2 file1
grep命令的詳細使用方法,可以參考man,在方法一中,用到了兩個引數。引數-v,表示invert match,即反向匹配,輸出沒有匹配上的項。引數-f,表示從檔案中讀取匹配模板(pattern)。方法一中的前一部分,在檔案file1中匹配模板,來反向匹配檔案file2中的內容,即輸出檔案file2中,在file1中沒有的內容。後面的一部分同理可得,輸出檔案file1中,在file2中沒有的內容。
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 '' file1 file2 |sort -k2|uniq -u -f 1|sort -k1|awk ''
或者:awk '' file1 file2 |sort|uniq -u
awk命令的使用,聽牛人說可謂博大精深,我也沒有太搞清楚。這裡只是使用了一些簡單的功能。下面以我自己的理解來解釋一下上面的shell**。awk就是文字的直譯器和過濾器。awk把每一行看成是乙個記錄(record),每個記錄使用分隔符(預設是空格)把每條記錄分成若干域。awk內建引數$0表示整行,$1、$2...分別表示各域,內建引數nr,表示記錄的計數,awk '' file1 file2表示依次讀取file1 file2,列印出每行,並且在前面新增行號。
命令sort,就是對行進行排序,引數-k表示根據各行的第幾個引數關鍵字開進行排序,這裡的-k2表示根據第二個關鍵字開始進行排序。
命令uniq,進行報告或者忽略重複的行,引數-u,表示只是列印出唯一的行(unique lines),-f表示忽略的每行的前n個域的比較。
Abrash和TimSweeney兩個文章
週末時候讀了abrash在valve寫的乙個blog 非常讓我驚嘆的是這些大神級程式設計師的視野,兩個人都是carmack時代的程式設計師,從中也可以看到真正的神級程式設計師,他們的持續的探索和視野,讓我很是欣賞,就應該這樣。abrash這個文章裡說到了valve的文化,這個也是讓我非常感興趣的乙個...
linux shell求兩個檔案的差 並 交集
比較兩個檔案 a.txt 11 2341 b.txt 56 121 使用命令comm比較,輸入檔案必須為有序 列之間使用製表符 t分隔 comm sort a.txt sort b.txt 11 1234 56 第一列為a與b的差集 a.txt b.txt comm sort a.txt sort ...
兩個比較特殊的SQL文實現
對資料庫中的資料,我們在現實的時候經常會有一些比較特殊的要求,例如 出報表的時候,需要把本來是3列的資料,按照不同的條數變成柳列來顯示,如果用程式來實現這樣的功能,一般都比較繁瑣,並且效率也不是很高,如果使用sql語句來完成的話,那麼資料在一出來的時候就是我們想要的格式,豈不是很好。下面就是兩個比較...