我有两个文本文件1.txt
,2.txt
其中包含两个制表符分隔的列。两个文件的第一列均由标记化文本组成。在这两个文件中,第一列是相同的。词序很重要。第二列由标签组成。在第一个文件中,标记化是完整的但不精确。在第二个文件中,它不完整但准确。
1.txt
:
I 3
was 5
there 6
yesterday 6
. 0
2.txt
:
I 3
was
there 12
yesterday
. 0
我想合并这两个文件(同时保持行的顺序),以便每行都有一个标签,因此更精确的(即 file 中的标签2.txt
)是首选,如下所示:
I 3
was 5
there 12
yesterday 6
. 0
我尝试过使用join
,但它只能显示两个标签或仅显示一个文件中的标签:
$ join 1.txt 2.txt
I 3 3
was 5
there 6 12
yesterday 6
. 0 0
$ join -1 1 -2 1 -o 1.1,2.2 1.txt 2.txt
I 3
was
there 12
yesterday
. 0
这个答案使用awk
看起来很接近,但没有提供预期的结果。我也更喜欢使用 coreutils。
答案1
使用awk
:
awk 'NR==FNR{if (NF==2) a[$1]=$2; next}
{print $1,($1 in a ? a[$1] : $2)}' 2.txt 1.txt
NR==FNR
如果编号记录等于文件编号记录(如果在第一个文件中)a[$1]=$2
使用第一个字段作为键将第二个字段存储到数组中$1 in a ? a[$1] : $2
if是print$1
中的一个键else printa
a[$1]
$2
答案2
这是另一种选择:
join 1.txt 2.txt | awk -e '{if($NF == "") print $1, $(NF - 1); else print $1, $NF}' | column -t
这使:
I 3
was 5
there 12
yesterday 6
. 0
这| column -t
是可选的,但只需将其格式化为漂亮的列即可。