1.txt

1.txt

这是我的两个文件

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将分隔符显式设置为制表符。这也会导致实用程序在输出中使用制表符。

相关内容