这是我的两个文件
1.txt
1
2
3
4
5
2.txt
2 a
5 3
比我得到的文件awk -F '\t' 'NR==FNR{F1[$0];next}$1 in F1{print}' 1.txt 2.txt
2 a
5 3
但我想得到这样的文件
1
2 a
3
4
5 3
或者
1 0
2 a
3 0
4 0
5 3
答案1
将空格转换2.txt
回制表符sed -i 's/ */\t/' 2.txt
,
awk -F '\t' '
BEGIN{OFS=FS} NR==FNR{F1[$1]=$2; next} {print $1, ($1 in F1)? F1[$1] : 0}
' 2.txt 1.txt
1 0
2 a
3 0
4 0
5 3
答案2
使用join
而不是awk
,它假设两个文件在第一个字段上排序(它们在问题中):
$ join -a 1 1.txt 2.txt
1
2 a
3
4
5 3
该-a 1
选项使实用程序报告第一个文件中的所有行,而不仅仅是连接到第一个字段的行。
为了另外用零替换缺失值,我们必须要求join
输出特定字段,并且还用 替换缺失值0
。我们-o 1.1,2.2
要求第一个文件中的第一个字段和第二个文件中的第二个字段,并用-e 0
以下命令替换丢失的数据0
:
$ join -a 1 -o 1.1,2.2 -e 0 1.txt 2.txt
1 0
2 a
3 0
4 0
5 3
使用-t $'\t'
withjoin
将分隔符显式设置为制表符。这也会导致实用程序在输出中使用制表符。