在 awk 中合并两个文件的输入

在 awk 中合并两个文件的输入

我读过一些关于awk.事实证明,它对于单个数据非常有用假设我有两个输入文件:

## inp1
x y
1 3
2 4
6 9
... 

## inp2
x z
1 5
2 19
6 9

我想输出“组合”两个文件的内容。就像是:

## output
x y z
1 3 5
2 4 19
6 9 9

我可以想到将这两个文件交错的想法,如下所示:https://stackoverflow.com/questions/4011814/how-to-interleave-lines-from-two-text-files并用 awk 做一些事情。

或者也许使用关联数组的东西?不过,我不太确定,这就是这个问题的原因;)。

我正在使用Linux。

答案1

听起来您只是在寻找join加入第一个字段上的文件:

$ join -j1 file1 file2 
x y z
1 3 5
2 4 19
6 9 9

请注意,join期望其输入被排序,因此您可能需要执行以下操作:

$ join -j1 <(sort file1) <(sort file2 )
1 3 5
2 4 19
6 9 9
x y z

然而,这会搞砸你的标题,所以为了避免这种情况,你可以这样做:

$ join -j1 <(head -n1 file1) <(head -n2 file2); join -j1 <(tail -n+2 file1|sort) <(tail -n+2 file2 |sort )
x y z
1 3 5
2 4 19
6 9 9

并将其保存到新文件中:

( \
    join -j1 <(head -n1 file1) <(head -n2 file2); 
    join -j1 <(tail -n+2 file1|sort) <(tail -n+2 file2 |sort ) \
) > newFile

或者,使用awk

$ awk 'NR==FNR{a[$1]=$2; next}{print $1,$2,a[$1]}' file2 file1 
x y z
1 3 5
2 4 19
6 9 9

答案2

通过您提供的示例输入,如果字段是制表符分隔的,那么您所需要的就是这样:

$ paste file1 <(cut -f2 file2)
x   y   z
1   3   5
2   4   19
6   9   9

或者如果用一个空格隔开的话:

$ paste -d' ' file1 <(cut -d' ' -f2 file2)
x y z
1 3 5
2 4 19
6 9 9

答案3

使用awk

  • 方法一
    awk 'FNR==NR{a[FNR]=$2;next}{print $1,a[FNR],$2}' f1 f2
    
  • 方法二
    awk 'NR==FNR{a[$1];a[FNR]=$2;next}($1 in a) {print $1,a[FNR],$2}' f1 f2
    

输出

x y z
1 3 5
2 4 19
6 9 9

相关内容