比较 2 个文件中每条记录之间的 n 个列值,并将文件 2 中的数据追加到文件 1

比较 2 个文件中每条记录之间的 n 个列值,并将文件 2 中的数据追加到文件 1

我有一个像这样的输入文件:

输入文件示例:

a|a1|a2|a3|a4|a5|...|a29|$2342
a|a1|a2|a3|a4|a5|...|a29|$2343
a|a1|a2|a3|a4|a5|...|a29|$2344
a|a1|a2|a3|a4|a5|...|a29|$2345
b|b1|b2|b3|b4|b5|...|b29|$100
c|c1|c2|c3|c4|c5|...|c29|$12

另一个文件的数据如下:

a|a1|a2|a3|a4|a5|...|a29|$2342|123|1.0|21.0
b|b1|b2|b3|b4|b5|...|b29|$100|12567|16.0|31.0
c|c1|c2|c3|c4|c5|...|c29|$12|6213|1.9|1.1

我试图使用这两个文件获得最终输出,如下所述:

a|a1|a2|a3|a4|a5|...|a29|$2342|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2343|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2344|123|1.0|21.0
a|a1|a2|a3|a4|a5|...|a29|$2345|123|1.0|21.0
b|b1|b2|b3|b4|b5|...|b29|$100|12567|16.0|31.0
c|c1|c2|c3|c4|c5|...|c29|$12|6213|1.9|1.1

我认为如果我们可以比较之前的列值#,如果发现相同,则将第二个文件中的值附加到第一个文件中。

答案1

这是一个典型的任务awk。这是一种可能的解决方案:

awk '
NR==FNR {
    match($0,/.*\$/)
    pref = substr($0,RSTART,RLENGTH)
    rest = substr($0,RSTART+RLENGTH)
    suff = substr(rest, index(rest,"|"))
    suffixes[pref] = suff
    next
}
{
    match($0,/.*\$/)
    prefix = substr($0,RSTART,RLENGTH)
    match($0,/.*\$[0-9]+|/)
    data = substr($0,RSTART,RLENGTH)
    if (prefix in suffixes)
        print data suffixes[prefix]
}
' file2 file1

file1您的问题中名为“输入文件”的文件在哪里,file2问题中名为“另一个文件”的文件在哪里。 (注意列表中文件的顺序。)

解释:

第一个命令块在读取第一个文件时执行file2;这是通过NR==FNR仅在读取第一个文件时为真的条件来实现的。仅对第二个文件执行第二个命令块file1(因为next第一个命令块中的指令)。第一个块提取前缀pref和后缀suff,并suffixes[pref] = suff为每个前缀记住相应的后缀;这是引用第二个块中的数据所必需的。在第二个块中,实际上执行了类似的命令来提取前缀,并使用它从存储的后缀中获取正确的后缀。只有一处不同:您还需要保留符号后面的数字#作为新前缀数据的一部分,因此还有第二个match操作;区分访问数组所需的前缀suffixes和作为结果数据一部分所需的前缀。

相关内容