我读过一些关于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