使用 awk 合并文件

Hat*_*ess 3 awk

我试图合并file1file2基于 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
Run Code Online (Sandbox Code Playgroud)

和文件 2

Dawning,Order.5.DHL
Hawkins,Order.3.FedEx
Jacob,Order.2.Yodel
Plateu,Order.4.DPD
Martins,Order.1.Hermes
Run Code Online (Sandbox Code Playgroud)

我的方法是从file2with 中提取密钥split。作为单个文件,这是可行的,但是当处理多个文件时,行为很奇怪,而不是预期的结果。

awk -F, '{{split($2,i,".")}{ print i[2]}' file2
5
3
2
4
1
Run Code Online (Sandbox Code Playgroud)
awk -F, 'NR==FNR{split($2,i,"."); next}{ print i[2]}' file2 file1
1
1
1
1
1
Run Code Online (Sandbox Code Playgroud)

如果我删除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
Run Code Online (Sandbox Code Playgroud)

我还采取了许多其他步骤,但都失败了,但这可能会使问题变得过于臃肿,所以如果需要更多关于此的信息,请询问。

我的预期结果是这样的

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
Run Code Online (Sandbox Code Playgroud)

其中 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
Run Code Online (Sandbox Code Playgroud)

我已经包含了perl标签,因为我对解决方案感兴趣,perlawk如果可能的话,主要想这样做。

谢谢你。

Sun*_*eep 5

$ 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
Run Code Online (Sandbox Code Playgroud)
  • -F'[.,]'使用.,作为字段分隔符file2
  • NR==FNR{a[$3]=$1; next}file2基于第三个字段的第一个字段保存为键
  • FS=,file1参数列表中的before将字段分隔符更改为,forfile1
  • print $2, a[$1], $3打印所需数据(默认OFS为单空格字符)