loki Asked: 2022-06-24 00:51:09 +0800 CST2022-06-24 00:51:09 +0800 CST 2022-06-24 00:51:09 +0800 CST 按第一列作为键逐列组合文件(使用 grep 或 awk 等) 772 这是我的两个文件 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 awk columns 2 个回答 Voted Best Answer steeldriver 2022-06-24T01:38:56+08:002022-06-24T01:38:56+08:00 使用, 将空格转换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 Kusalananda 2022-06-24T01:43:41+08:002022-06-24T01:43:41+08:00 使用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将分隔符显式设置为制表符。这也会导致实用程序在输出中使用选项卡。
使用, 将空格转换
2.txt
回制表sed -i 's/ */\t/' 2.txt
符使用
join
而不是awk
,它假定这两个文件在第一个字段上排序(它们在问题中):该
-a 1
选项使实用程序报告第一个文件中的所有行,而不仅仅是加入第一个字段的行。要另外用零替换缺失值,我们必须要求
join
输出特定字段,并用0
. 我们从-o 1.1,2.2
第一个文件中请求第一个字段,从第二个文件中请求第二个字段,并使用以下-e 0
内容替换丢失的数据0
:使用
-t $'\t'
withjoin
将分隔符显式设置为制表符。这也会导致实用程序在输出中使用选项卡。