我正在尝试根据与awk匹配的密钥合并多个文件的内容,我已经看到仅针对两个输入文件的解决方案,但不是更多。输入文件如下所示:
文件1
1#a1
2#b1
3#c1
4#d1
6#f1
file2的
1#a2
2#b2
3#c2
5#e2
6#f2
file3的
1#a3#extra_field_1
2#b3#extra_field_2
3#c3#extra_field_3
4#d3#extra_field_4
5#e3#extra_field_5
所需的输出如下:
输出
a1;a2;a3;extra_field_1
b1;b2;b3;extra_field_2
c1;c2;c3;extra_field_3
d1;;d3;extra_field_4
;e2;3e;extra_field_5
为此,我使用基于awk命令的bash脚本,如下所示:
$ awk -v OFS=';' -F '#' 'FNR==NR{a[$1]=$2;next} FNR!=NR{b[$1]=$2;next} NF==3{print a[$1],b[$1],$2,$3}' file1 file2 file3 > output
无论如何,它似乎避免了一些输入,因为它没有产生任何输出,任何想法?
感谢。
答案 0 :(得分:2)
您只需使用join
命令
join -t\# file1 file2 -j 1 |\
join -t\# - file3 -j 1 |\
cut -d\# --output-delimiter=\; -f2-5
输出
a1;a2;a3;extra_field_1
b1;b2;b3;extra_field_2
c1;c2;c3;extra_field_3
答案 1 :(得分:1)
使用paste和awk的另一种方法:
paste -d"#" file1 file2 file3 | awk -F"#" '{print $2,$4,$6,$7}' OFS=";"
答案 2 :(得分:0)
使用awk
和3个文件对我来说太复杂了,所以我会提供其他的东西。使用粘贴:
for x in $(paste -d"#" a b c); do x=${x#\#}; x=${x//\#\#/\;}; echo ${x//\#/;};done
粘贴是我的合并工具 - 从那里纯粹的Bash或tr
可以完成工作,如果你没有。粘贴""会出现问题。作为分隔符导致第一列(文件)消失。不知道为什么,但这就是使用其他东西的原因 - "#"在这里,将##作为分隔符的两个##作为粘贴的结果。
另一个选择是逐行读取所有文件以获得纯粹的bash,但我认为这样做太过分了。
答案 3 :(得分:0)
这是awk中的一个。它没有考虑丢失的数据,因为您没有在问题中说明应该如何处理。它将所有数据散列为a
哈希,并将其输出到END
:
$ awk '
BEGIN { FS="#"; OFS=";" }
{
for(i=2;i<=NF;i++)
a[$1]=a[$1] (a[$1]==""?"":OFS) $i
}
END {
for(i in a)
print a[i]
}' f1 f2 f3
a1;a2;a3;extra_field_1
b1;b2;b3;extra_field_2
c1;c2;c3;extra_field_3