簡體   English   中英

如何基於列為鍵合並兩個文件

[英]How to merge two files based on column as a key

如何合並兩個基於列的文件作為鍵,如何從a.txt匹配$ 1列並基於$ 3列追加b.txt

a.txt
aa; 2.5; 0.001;
ab; 1.5; 0.003;
ac; 0.4; 0.002;

b.txt

20-Nov-2014; 1775.00; aa;
20-Nov-2014; 1775.00; aa;
20-Nov-2014; 1463.40; ab;
20-Nov-2014; 1463.40; ac;
20-Nov-2014; 1463.40; ab;

Desired output look like this 
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
20-Nov-2014; 1463.40; ac; ac; 0.4; 0.002;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;

Thanks
$ awk -F';' 'FNR==NR{a[$1]=$0;next;} {print $0" " a[substr($3,2)];}' a.txt b.txt
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
20-Nov-2014; 1463.40; ac; ac; 0.4; 0.002;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;

這個怎么運作

awk隱式循環遍歷文件中的每一行。 每行均分為多個字段。

  • -F';'

    這告訴awk使用分號作為字段分隔符。

  • FNR==NR{a[$1]=$0;next;}

    NR是到目前為止已讀取的行數,而FNR是到目前為止已從當前文件讀取的行數。 因此,當FNR==NR ,我們仍在讀取第一個文件a.txt 在這種情況下,此集合將剛讀入的整行$0分配給鍵$1的第三個字段數組a

    next告訴awk跳過下面的其余命令,並跳到下一行並重新開始。

  • print $0" " a[substr($3,2)]

    如果到達此處,則意味着我們正在處理第二個文件b.txt 在這種情況下,請打印此文件的每一行,然后打印數組a的行, a與第三字段匹配。

    在文件b.txt ,第三個字段以空格開頭。 在數組a查找此字段時,該空間將通過substr函數刪除。

awk -F\; 'NR==FNR{arr[" "$1]=$0;next} {print $0, arr[$3]}'  a b
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
20-Nov-2014; 1463.40; ac; ac; 0.4; 0.002;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
$ awk -F'; ?' 'NR==FNR{a[$1]=$0;next} {print $0, a[$3]}' a.txt b.txt
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1775.00; aa; aa; 2.5; 0.001;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;
20-Nov-2014; 1463.40; ac; ac; 0.4; 0.002;
20-Nov-2014; 1463.40; ab; ab; 1.5; 0.003;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM