使用awk合并文件
我试图合并file1并file2基于 column2 from 中file2的数字和 column1 from 中的数字file1主要由逗号分隔。.我试图匹配的数字之间也有一个分隔符file2
这是文件 1。
1,Mary,24 Fuller Rd
2,Fred,19 St Johns
3,Jonathan,8 Poplar Drive
4,Susan,116 Shepherds Way
5,Michael,4 Nerthern Court
和文件 2
Dawning,Order.5.DHL
Hawkins,Order.3.FedEx
Jacob,Order.2.Yodel
Plateu,Order.4.DPD
Martins,Order.1.Hermes
我的方法是从file2with 中提取密钥split。作为单个文件,这是可行的,但是当处理多个文件时,行为很奇怪,而不是预期的结果。
awk -F, '{{split($2,i,".")}{ print i[2]}' file2
5
3
2
4
1
awk -F, 'NR==FNR{split($2,i,"."); next}{ print i[2]}' file2 file1
1
1
1
1
1
如果我删除split但无法提取匹配,我只会得到预期的结果。
awk -F, 'NR==FNR{array[$2]}END{ for (i in array) print i}' file2 file1
Order.4.DPD
Order.3.FedEx
Order.1.Hermes
Order.5.DHL
Order.2.Yodel
我还采取了许多其他步骤,但都失败了,但这可能会使问题变得过于臃肿,所以如果需要更多关于此的信息,请询问。
我的预期结果是这样的
Mary Martins 24 Fuller Rd
Fred Jacob 19 St Johns
Jonathan Hawkins 8 Poplar Drive
Susan Plateu 116 Shepherds Way
Michael Dawning 4 Nerthern Court
其中 column2 fromfile2和 column1file1基于数字匹配,因此打印$2和$NFfromfile1和$1fromfile2
以下是我在众多尝试中失败的一些
awk -F, 'NR==FNR {M=$1; array[$2]; next}{($1 in array)}END{ for (i in array) print $2, M, $NF}' file2 file1
awk -F, 'NR==FNR {M=$1; array[$2]; for (i in array) split(i,a,"."); next} $1==a[2]{print $2,M, $3}' file2 file1
awk -F, 'NR==FNR {M=$1; array[$2]; next}END { for (i in array) split(i,a,".")}($1~a[2]){ print $2,M}' file2 file1
我已经包含了perl标签,因为我对解决方案感兴趣,perl但awk如果可能的话,主要想这样做。
谢谢你。
回答
$ awk -F'[.,]' 'NR==FNR{a[$3]=$1; next} {print $2, a[$1], $3}' file2 FS=, file1
Mary Martins 24 Fuller Road
Fred Jacob 19 St Johns
Jonathan Hawkins 8 Poplar Drive
Susan Plateu 116 Shepherds Way
Michael Dawning 4 Nerthern Court
-F'[.,]'使用.或,作为字段分隔符file2NR==FNR{a[$3]=$1; next}将file2基于第三个字段的第一个字段保存为键FS=,file1参数列表中的before将字段分隔符更改为,forfile1print $2, a[$1], $3打印所需数据(默认OFS为单空格字符)