awk - 两个文件之间几列的部分匹配,并返回用逗号连接的两个文件的一行

问题描述

我有两个文件,每个文件都包含以下内容

/tmp/mydir-1

direction=1,code=a b c d,time=xxxx
direction=1,code=f x fdfsdf sdfs,code=a b c f,time=xxxx

和第二个文件 /tmp/mydir-2:

direction2=2,code2=a b c fsd,time2=xxxx
direction2=2,code2=f x fdfsdf sdfs,code2=a b c ff,time2=xxxx

我想在 file2 中匹配,只有包含 code2=XXX 的行与第一个文件中的 code=XXX 匹配,并返回由 , 连接的两个文件的每一行。>

这意味着如果这里这两个文件之间唯一匹配的行是:

direction=1,time=xxxx

direction2=2,time2=xxxx

所以返回:

direction=1,time=xxxx,direction2=2,time2=xxxx

我是 awk 的新手。我需要做一些事情,但仍然不知道如何将这些事情联系在一起。

我知道这样我可以拆分 code 或 code2 列并在 = 之后打印实际值:

cat /tmp/mydir-1 |  awk -F ',' '{split($2,aa,"="); print aa[2]}'

返回:

a b c d
f x fdfsdf sdfs
a b c f

现在我试图用 = 拆分代码列并比较两个文件间的值,这就是我出错的地方。

当我执行此操作时:

awk -F ',' 'FNR==NR {split($2,"="); a[aa[2]]; next} split($2,aaa,"="); aaa[2] in a' /tmp/mydir-1 /tmp/mydir-2

我得到的线条是 mydir-2 重复:

direction2=2,code2=a b c f,time2=xxxx

所以这就是我被卡住的地方。我猜我正在以某种方式将第二个文件与其自身进行比较?不太确定如何从这里继续。

有关此问题的任何信息将不胜感激。

谢谢

更新

感谢@KamilCuk 的更新。

我更改了变量名称,这是命令:

awk -F ',f1split,"="); f1[f1split[2]]; next} {split($2,f2plit,"=");} f2split[2] in f1' /tmp/mydir-1 /tmp/mydir-2

正如@KamilCuk 提到的那样,我在 {} 中为第二个文件添加了第二个拆分,当我执行它时,结果为空。

变量名称以及我认为它们的含义:

f1: first file
f2: 2nd file
f1split: first file 'code' split
f2split: 2nd file 'code2' split

在 awk 代码与第一个文件相关以及与第二个文件相关的问题上,我是否正确理解了 awk 语法?

awk 'FNR==NR {<CODE FOR FirsT FILE>} <CODE FOR 2nd FILE>' /tmp/mydir-1 /tmp/mydir-2

解决方法

split 返回元素的数量,所以它是非零的,所以它打印行。把它放在{ }

awk -F ',' '
FNR==NR{
      split($2,aa,"=");
      a[aa[2]];
      next
}
# empty non-zero expression prints the line
# put it inside { } to silence output
{ split($2,aaa,"=") }

# Use different variables names then a aa aaa....
aaa[2] in a
' /tmp/mydir-1 /tmp/mydir-2
,
$ cat tst.awk
BEGIN { FS="[=,]"; OFS="," }
NR==FNR {
    file1[$4] = $0
    next
}
$4 in file1 {
    print file1[$4],$0
}

$ awk -f tst.awk file1 file2
direction=1,code=f x fdfsdf sdfs,time=xxxx,direction2=2,code2=f x fdfsdf sdfs,time2=xxxx