我有一个像这样的输入文件:
输入文件示例:
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
和作为结果数据一部分所需的前缀。