首先,对不起我的英语,我知道很多关于AWK的话题,但对我来说这是一个非常困难的功能......
我想使用常见的列与awk合并两个表。表格的行数不同。我有我要修改的第一个表,第二个作为参考表。我想将colunme1.F1
与column1.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。
那边有英雄吗?
答案 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_1
,1
中的Bib1
等等。在有破折号的城市等可能会失败,请相应地修改[^[:alpha:]]
中的模式split
。标题与这些名称不匹配,重新考虑标题名称。