如何打印文件 1 中的所有记录,但记下与文件 2 不匹配的记录?

如何打印文件 1 中的所有记录,但记下与文件 2 不匹配的记录?

有没有一种简单的方法可以打印 a 的所有行file1(以便输出与输入具有相同的行数file1),但打印一条消息,例如NoMatchfile1 的第一个条目与 的第一个条目不匹配file2

文件1:

Entry1 Entry2
a 2
b 3
c 4
d 5

文件2:

a
b
b
a
d
d

期望的输出:

Entry1
a 2
b 3
NoMatch 4
d 5

我正在尝试与

join -a1 -e "NoMatch" -11 -21 -o2.1 file1 file2

因为我想保留file1不匹配的不可配对行file2,并为这些情况给出一条消息“否”,但这也保留了我的所有记录file2(其中包含重复的记录),我做错了什么?这可能是因为我的第二个文件是制表符分隔的,而我的第一个文件是空格分隔的?

非常感谢您的所有帮助...

答案1

awk首先读取并file2保存$1seen[$1]然后读取file1,如果$1没有“看到”,请将其替换为NoMatch

awk 'FNR==NR{seen[$1]++; next}
{(FNR==1 || ($1 in seen)) || $1="NoMatch"};1' file2 file1

如果您愿意join,您需要排序输入。您必须首先head从其余行中提取 er file1,然后使用ed提取结果:sortjoinsortfile2

{ head -n1; sort | join -j1 -a1 -e "NoMatch" -o 2.1 1.2 - <(sort file2); } <file1

如果需要,将所有内容通过管道传输以uniq避免重复行:

{ head -n 1; sort | \
join -j1 -a1 -e "NoMatch" -o 2.1 1.2 - <(sort file2) | \
uniq; } <file1

相关内容