請使用awk指令将如下兩份檔案中名字相同的兩行合并起來
1
2
3
4
5
6
7
8
9
10
<code>[root@localhost ~]</code><code># cat 1.txt</code>
<code>韓海林 21歲</code>
<code>海林韓 23歲</code>
<code>韓林海 22歲</code>
<code>林海韓 24歲</code>
<code>[root@localhost ~]</code><code># cat 2.txt</code>
<code>韓林海 男</code>
<code>海林韓 男</code>
<code>韓海林 男</code>
<code>林海韓 男</code>
輸出效果:
韓海林 21歲 男
<code>[root@localhost ~]</code><code># awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 2.txt 1.txt</code>
<code>韓海林 21歲 男</code>
<code>海林韓 23歲 男</code>
<code>韓林海 22歲 男</code>
<code>林海韓 24歲 男</code>
<code>[root@localhost~]</code><code># awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 2.txt 1.txt > 3.txt</code>
<code>[root@localhost ~]</code><code># cat 3.txt </code>
解釋:
在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]數組内容;
<code>[root@localhost ~]</code><code># awk 'NR==FNR{a[$1]=$2;next}NR>FNR{if($1 in a)print $0,a[$1]}' 2.txt 1.txt </code>
檔案順序不同,結果也不同;
<code>[root@localhost ~]</code><code># awk 'NR==FNR{a[$1]=$2}NR>FNR{print $0,a[$1]}' 1.txt 2.txt </code>
<code>韓林海 男 22歲</code>
<code>海林韓 男 23歲</code>
<code>韓海林 男 21歲</code>
<code>林海韓 男 24歲</code>
<code></code><code></code>
<code></code><code>本文轉自 模範生 51CTO部落格,原文連結:http://blog.51cto.com/mofansheng/1671764,如需轉載請自行聯系原作者</code>
<code></code>