我想知道如何处理以下信息:
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
-当前记录中的字段数)。