使用awk

时间:2017-08-17 13:01:01

标签: bash awk gawk

我正在尝试根据与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

无论如何,它似乎避免了一些输入,因为它没有产生任何输出,任何想法?

感谢。

4 个答案:

答案 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