天天看點

awk實際應用:文本合并

請使用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&gt;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&gt;FNR{print $0,a[$1]}' 2.txt  1.txt &gt; 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&gt;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&gt;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&gt;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&gt;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>