如何使用awk合并2个表

时间:2017-07-18 12:57:34

标签: linux bash shell awk

首先,对不起我的英语,我知道很多关于AWK的话题,但对我来说这是一个非常困难的功能...... 我想使用常见的列与awk合并两个表。表格的行数不同。我有我要修改的第一个表,第二个作为参考表。我想将colunme1.F1column1.F2进行比较。如果匹配,请在column2.F2中添加file1。但我需要保留file1中的所有内容。

我举个例子:

File1中

Num_id,Name,description1,description2,description3
?,atlanta_1,,,      
RO_5,babeni_SW,,,           
? ,Bib1,,,          
RO_9,BoUba_456,,,           
?,Castor,,,         

文件2

official_Num_id,official_Name
RO_1,America
RO_2,Andre
RO_3,Atlanta
RO_4,Axa
RO_5,Babeni
RO_6,Barba
RO_7,Bib
RO_8,Bilbao
RO_9,Bouba
RO_10,Castor

文件3

Num_id,Name,description1,description2,description3,official_Name
?,atlanta_1,,,
RO_5,babeni_SW,,,Babeni
?,Bib1,,,
RO_9,BoUba_456,,,Bouba
?,Castor,,,

我在互联网上阅读了很多解决方案,似乎awk可以工作.. 我试过awk 'NR==FNR {h[$1] = $2; next} {print $0,h[$1]}' $File1 $File2 > file3 但是我的命令不起作用,我的File3看起来与File1完全相同。

第二次,我不知道当名字与atlanta_1和亚特兰大有区别时,是否可以比较我的第二列,并在我的File1中添加official_num_id和official_name。

那边有英雄吗?

3 个答案:

答案 0 :(得分:1)

你有它,除了两件小事。首先,您需要将文件分隔符设置为,,然后在命令行上反转输入文件的顺序,以便首先处理参考文件:

$ awk 'BEGIN {FS=OFS=","} NR==FNR {h[$1] = $2; next} {print $0,h[$1]}' File2 File1
Num_id,Name,description1,description2,description3,
?,atlanta_1,,,,
RO_5,babeni_SW,,,,Babeni
? ,Bib1,,,,
RO_9,BoUba_456,,,,Bouba
?,Castor,,,,

答案 1 :(得分:1)

您也可以使用join命令:

 join --header  --nocheck-order -t, -1 1 -2 1 -a 1 file1 file2

答案 2 :(得分:0)

要回答您的问题,如果可以比较我的两个第二列,当名称与atlanta_1和亚特兰大有区别时,并在我的File1 中添加official_num_id和official_name:

$ awk '
BEGIN { FS=OFS="," }
NR==FNR {                                                  # file2
    a[tolower($2)]=$0                                      # hash on lowercase city
    next
}
{                                                          # file1
    split($2,b,"[^[:alpha:]]")                             # split on non-alphabet
    print $0 (tolower(b[1]) in a?OFS a[tolower(b[1])]:"")  
}' file2 file1 
Num_id,Name,description1,description2,description3
?,atlanta_1,,,,RO_3,Atlanta
RO_5,babeni_SW,,,,RO_5,Babeni
? ,Bib1,,,,RO_7,Bib
RO_9,BoUba_456,,,,RO_9,Bouba
?,Castor,,,,RO_10,Castor

split会将Name字段拆分为非字母字符,即_中的atlanta_11中的Bib1等等。在有破折号的城市等可能会失败,请相应地修改[^[:alpha:]]中的模式split。标题与这些名称不匹配,重新考虑标题名称。