【问题标题】:awk - partial match of several columns between two files and return a one liner of both files concatenated with commaawk - 两个文件之间几列的部分匹配,并返回两个文件的一行,用逗号连接
【发布时间】:2021-05-24 05:14:29
【问题描述】:

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

/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

我想在 file2 中匹配,仅包含与第一个文件中的 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

我是 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,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

【问题讨论】:

    标签: awk partial-matches


    【解决方案1】:
    $ 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
    

    【讨论】:

      【解决方案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
      

      【讨论】:

        猜你喜欢
        • 2016-12-09
        • 1970-01-01
        • 2018-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-09-22
        • 1970-01-01
        相关资源
        最近更新 更多