首頁 > 軟體

awk實際應用:文字合併

2020-06-16 17:57:08

請使用awk命令將如下兩份檔案中名字相同的兩行合併起來
[root@localhost ~]# cat 1.txt
韓海林 21歲
海林韓 23歲
韓林海 22歲
林海韓 24歲
[root@localhost ~]# cat 2.txt
韓林海 男
海林韓 男
韓海林 男
林海韓 男

輸出效果:
    韓海林 21歲 男 
[root@localhost ~]# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 2.txt  1.txt
韓海林 21歲 男
海林韓 23歲 男
韓林海 22歲 男
林海韓 24歲 男

[root@localhost~]# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 2.txt  1.txt > 3.txt
[root@localhost ~]# cat 3.txt 
韓海林 21歲 男
海林韓 23歲 男
韓林海 22歲 男
林海韓 24歲 男

解釋:
在awk裡,NR和FNR的含義相近,唯一的區別就是作用範圍,NR是所有讀取的行資訊計數,而FNR是正在讀取檔案的行資訊計數,FNR在檔案切換時會從0重新開始計數,所以上述語句的意思是:
NR==FNR  NR最大值為4,FNR值為1-4,以2.txt的第一個資料項為key,$2即第2列為資料組成陣列;
NR>FNR  此時NR=(2.txt的總行數+FNR),NR最大值為8,FNR則重新從1-4計數,判斷第一個資料項在不在2.txt資料組成的陣列裡,如果在,則列印本行加陣列項。

NR是英文number of record的簡寫,就是awk每從檔案或輸入流中讀入一行資料,就把這個變數加一。這個是awk自帶的變數。

其他的解釋:
NR==FNR{a[$1]=$2}
開啟第一個檔案2.txt,把檔案裡面的$2列的內容存入到a[$1]這個陣列。
NR>FNR{print $0,a[$1]}
然後開啟第二個檔案,列印1.txt一行內容,然後列印第一個檔案a[$1]陣列的內容。


加入if判斷,更容易理解,上面的命令省略了;判斷1.txt的第一列內容在a陣列裡面,列印整行內容和a[$1]陣列內容;
[root@localhost ~]# awk 'NR==FNR{a[$1]=$2;next}NR>FNR{if($1 in a)print $0,a[$1]}' 2.txt 1.txt 
韓海林 21歲 男
海林韓 23歲 男
韓林海 22歲 男
林海韓 24歲 男

檔案順序不同,結果也不同;
[root@localhost ~]# awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 1.txt 2.txt 
韓林海 男 22歲
海林韓 男 23歲
韓海林 男 21歲
林海韓 男 24歲

awk賦值操作符  http://www.linuxidc.com/Linux/2015-06/118887.htm

awk跳脫序列與算術操作符  http://www.linuxidc.com/Linux/2015-06/118886.htm

AWK簡介及使用範例 http://www.linuxidc.com/Linux/2013-12/93519.htm

AWK 簡介和例子 http://www.linuxidc.com/Linux/2012-12/75441.htm

Shell指令碼之AWK文字編輯器語法 http://www.linuxidc.com/Linux/2013-11/92787.htm

正規表示式中AWK的學習和使用 http://www.linuxidc.com/Linux/2013-10/91892.htm

文字資料處理之AWK 圖解 http://www.linuxidc.com/Linux/2013-09/89589.htm

如何在Linux中使用awk命令 http://www.linuxidc.com/Linux/2014-10/107542.htm

文字分析工具-awk  http://www.linuxidc.com/Linux/2014-12/110939.htm

本文永久更新連結地址http://www.linuxidc.com/Linux/2015-07/120402.htm


IT145.com E-mail:sddin#qq.com