Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk合并多个输入文件_Bash_Awk_Gawk - Fatal编程技术网

Bash 使用awk合并多个输入文件

Bash 使用awk合并多个输入文件,bash,awk,gawk,Bash,Awk,Gawk,我正在尝试根据与awk匹配的密钥合并多个文件的内容,我只看到了两个输入文件的解决方案,但没有更多。输入文件如下所示: file1 1#a1 2#b1 3#c1 4#d1 6#f1 文件2 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 所需的输出如下: $ awk -v OFS=';' -

我正在尝试根据与awk匹配的密钥合并多个文件的内容,我只看到了两个输入文件的解决方案,但没有更多。输入文件如下所示:

file1

1#a1
2#b1
3#c1
4#d1
6#f1
文件2

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
所需的输出如下:

$ 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
输出

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
无论如何,它似乎排除了一些输入,因为它不产生任何输出,任何想法


谢谢。

您只需使用
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

这是awk中的一个。它没有考虑到丢失的数据,因为您在问题中没有说明应该如何处理它。它将所有数据散列到
散列中
并在
末尾输出:

$ 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
$awk'
开始{FS=“#”;OFS=“;”}
{

对于(i=2;i使用粘贴和awk的另一种方式:

paste -d"#" file1 file2 file3 | awk -F"#" '{print $2,$4,$6,$7}' OFS=";"

我想我的示例可能更详尽。事实上,所需的输出将收集第三个文件的每条记录,并使用匹配的键添加其他两个文件的每第二个字段。当然。由于问题的数量是无限的,而不是我们为您猜一个,如果您向我们提供事实,您会得到更好的结果。可以吗这是一种很好的方法,使用
join
简化输入,感谢您的提示。无论如何,使用此命令很难编写更复杂的逻辑。