两个文件之间若干列的部分匹配,并返回两个文件的一行逗号连接



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

/tmp/mydir-1:

direction=1, code=a b c d, time=xxxx
direction=1, code=f x fdfsdf sdfs, time=xxxx
direction=1, 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, time2=xxxx
direction2=2, code2=a b c ff, time2=xxxx

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

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

direction=1, code=f x fdfsdf sdfs, time=xxxx

direction2=2, code2=f x fdfsdf sdfs, time2=xxxx

所以要返回:

direction=1, code=f x fdfsdf sdfs, time=xxxx, direction2=2, code2=f x fdfsdf sdfs, time2=xxxx

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

我知道有了这个,我可以拆分代码或代码2列,并在=之后用打印实际值

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,aa,"="); 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
direction2=2, code2=a b c f, time2=xxxx
direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
direction2=2, code2=f x fdfsdf sdfs, time2=xxxx
direction2=2, code2=a b c ff, time2=xxxx

所以这就是我陷入困境的地方。我猜我是在以某种方式将第二个文件与自己进行比较?不知道如何从这里继续。

任何关于这个问题的信息都将不胜感激。

感谢

更新

感谢@KamilCuk的更新。

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

awk -F ', ' 'FNR==NR {split($2,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
$ 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

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

相关内容

  • 没有找到相关文章

最新更新