2017-07-18 106 views
0

首先,我的英语很抱歉,我知道AWK有很多不同的主题,但对我来说这是一个非常困难的功能...... 我想合并两个使用常见用awk列。这些表格的行数不同。我有我想要修改的第一张表格,第二张表格是参考表格。我想比较我的colunme1.F1和我的。匹配时,在我的file1中添加column2.F2。但我需要保留我所有的线路file1如何使用awk合并2个表

我给你举个例子:

文件1

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

'file3'中的逗号计数不正确。 –

回答

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,,,, 
+0

谢谢,它的作品!其实我有“;”而不是“,”我没有注意到,在你的帖子之前..我不明白的东西,我的第四列不会出现在第四列,但在我的第二个柱子里面,想法为什么? –

+0

我找到了原因,这是因为我的输出文件中有字符^ M。使用awk -v RS ='\ r \ n'...解决我的问题 –

1

您也可以使用此join命令:

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

要回答你的问题如果有可能比较我的两个第二柱体时的名字有像atlanta_1和亚特兰大的差异,并添加official_num_id和official_name在我的文件1

$ 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将在atlanta_1劈在非字母字符Name领域,即_1Bib1等,所以可能在split因此无法与破折号等城市,编辑花样[^[:alpha:]]。标题与这些名称不匹配,请重新考虑标题名称。

+0

非常感谢。这非常好!你能解释一下我分裂后的第二部分吗?我了解这个概念,但不是每个参数..!你也告诉我,如果名字有冲刺,我会遇到问题。如果我有像巴巴尼软件的空间,我会有同样的概率?事实上,我们的目标是将所有名称标准化,以便我可以找到很多不同的情况。 –

+0

由于“拆分”拆分@任何非字母字符(目前以上面的代码),例如比利时城市Knokke-Heist(谢谢维基)将被错误地拆分为Knokke。你可以通过加入“[^ [:alpha:] - ]”来避开,但不能再用它作为特殊字符。如果名称中有空格的城市,则会产生错误的输出。只是测试它。 –

+0

使用_second part_我假设你的意思是'print'。它从'file1'打印当前记录('$ 0'),将'split'城市名称的第一部分(例如babani)转换为小写形式,在'file2'的散列中查找,如果找到,在$ 0之后输出。它被称为_conditional operator_:'(如果是true?则返回this:else this)'。 –