使用 awk 处理具有动态列数的映射文件

使用 awk 处理具有动态列数的映射文件

我想知道如何处理以下信息:

mapping.txt:

80  001 002
81  011 012 013 014
82  021 022
...

input.txt:

81  103823044
80  103823054
81  103823064
...

期望output.txt

103823044|011|
103823044|012|
103823044|013|
103823044|014|
103823054|001|
103823054|002|
103823064|011|
103823064|012|
103823064|013|
103823064|014|

我已经完成了简单的映射,其中列号是固定的,但我不确定如何将动态列数映射到所需的输出

答案1

您可以尝试以下操作:

awk 'NR == FNR { x[$1,$2] = $1; next; } { for (i in x) { if (x[i] == $1) { split(i,t,SUBSEP); for (z = 2; z <= NF; z++) { print t[2] "|" $z "|"; } } } }' input.txt mapping.txt

第一个块在读取文件时执行input.txt。这是通过读取第一个文件时NR == FNR的条件来实现的。true在第一个块中,我们创建一个数组,x其中包含第一列和第二列的键和第一列的值。mapping.txt由于next在第一个块中,因此对文件执行第二个块。在第二个块中,我们检查数组中的每个键,x第一列中的值是否作为数组中的值存在x,如果存在,则提取键的第二部分split,然后在循环中打印该值以及从第二列到最后一列的值(NF-当前记录中的字段数)。

相关内容