Linux下求差集運算方法小結

2021-07-06 08:03:49 字數 1472 閱讀 4466

在實際的工作中我們經常會遇到求資料的差集的問題。比如,原來資料庫的某個表中有1000條資料,後來經過一些後續的變更,變成了1200條資料了。那麼我們如何求得這多出來的200條資料究竟是哪一些呢?在此,我做了乙個小小的總結,把求解此類問題的方法在此列出。為了後面敘述的方便,現把原來的1000條資料的檔案命名為file1.txt,後來的1200條資料的檔案命名為file2.txt。file1.txt和file2.txt的資料格式完全一樣,就是每行放乙個字段。此處有乙個前提,較多的1200條資料的file2.txt完全包含較少的1000條資料的file1.txt,就是不存在file1.txt中存在,但是file2.txt中不存在的資料。

方法一:利用uniq命令

cat file1.txt file2.txt | sort | uniq -d
這個比較簡單,首先是開啟兩個檔案,然後進行排序,最後進行乙個取唯一的操作。注意uniq後要有-d引數,其意思就是只列印出重複的行。就是前面兩個檔案中都存在的行。

方法二:利用comm命令

comm file1.txt file2.txt
但是利用comm命令有乙個前提,就是這兩個檔案file1.txt和file2.txt必須是排序和唯一的(sort and uniq)。預設輸出為三列,第一列為file1.txt-file2.txt,第二列為file2.txt-file1.txt,第三列為:file1.txt與file2.txt的差集。

方法三:利用awk命令

awk命令絕對算是linux命令中功能超級強大的命令之一了。以下兩種方式都可以得到想要的結果。

awk 'argind==1 argind>1&&!($0 in a)' file1.txt file2.txt

awk 'nr==fnr nr>fnr&&!($0 in a) ' file1.txt file2.txt

在此首先解釋一下awk的工作流程:

上圖是awk最權威的一本書裡面的描述。它簡潔明瞭地描述了awk的工作流程。

argind: the index in argv of the current file being processed.

nr: 代表記錄的數目,相當於當前正在執行的當前的行數

fnr: file number of record

nr和fnr的區別:如果有兩個輸入檔案,nr在兩個檔案之間會持續增長。當開始處理第二個檔案時,nr不會被置為1,相反它會從第乙個檔案的最大值處繼續遞增。

所以上述兩條命令的本質就是:當awk處理的是第乙個檔案時,將第乙個檔案的每一行資料作為a的鍵;當處理到第二個檔案時,如果讀取的某一行資料在a中的鍵中不存在,就把它列印出來,這行資料就是檔案1中不存在的資料。整個awk過程處理完,就會把所有在檔案2中存在但是在檔案1中不存在的是資料給列印出來了。

Linux 下DNS配置小結

1.安裝參見 2.自己的配置 主配置檔案 etc named.conf options listen on v6 port 53 directory var named dump file var named data cache dump.db statistics file var named ...

Linux下ps命令小結

1 ps a 顯示現行終端機下的所有程式,包括其他使用者的程式。2 ps a 顯示所有程式。3 ps c 列出程式時,顯示每個程式真正的指令名稱,而不包含路徑,引數或常駐服務的標示。4 ps e 此引數的效果和指定 a 引數相同。5 ps e 列出程式時,顯示每個程式所使用的環境變數。6 ps f ...

Linux下vi命令小結

進入vi的命令 vi filename 開啟或新建檔案,並將游標置於第一行首 vi n filename 開啟檔案,並將游標置於第n行首 vi filename 開啟檔案,並將游標置於一行首 vi pattern filename 開啟檔案,並將游標置於第乙個與pattern匹配的串處 vi r f...