在第一列上连接两个文本文件,保持第一个文件中的顺序和不可配对的行

在第一列上连接两个文本文件,保持第一个文件中的顺序和不可配对的行

我需要合并我拥有的两个文件,但在合并它们之前我首先需要它匹配。这是我的第一个文件,其中包含 100 万行。

abcde
fghi
jklmn
opqrs
123456
0000

第二个文件包含 300 万行,但仍有一些行包含第一个文件中的字符串。

543123:fdfdss
dfskld:533fg
abcde:1234
fdskls:fkdfs
gfdkls:flfds
0000:5432
fdsk:saakl

输出:

abcde:1234
fghi
jklmn
opqrs
123456
0000:5432

我希望输出为 file1:file2,但前提是它与 file2 的第一列和 file1 中的字符串匹配。我不想打乱排序格式,我希望它按这个顺序排列,并且我想保留 file1 字符串,但只添加匹配的字符串。

答案1

简单的方法是通过awk- 只需读取第二个文件,将每一行保存到数组中(其中索引为 $1),并在读取第一个文件时检查该行是否已经是数组中的索引 - 如果是,则替换为该元素的值:

awk -F: 'NR==FNR{z[$1]=$0;next}
($0 in z) {$0=z[$1]};1' file2 file1

您也可以执行此操作,join但需要更多工作(基本上,对第一个文件中的行进行编号,以便能够对结果进行排序join并恢复顺序):

join -a 1 -t: -1 2 -2 1 <(nl -s: -ba -nrz file1 | sort -t: -k2,2) \
<(sort -t: -k1,1 file2) | sort -t: -k2,2 | cut -d: -f1,3-

相关内容