有没有一种简单的方法可以打印 a 的所有行file1
(以便输出与输入具有相同的行数file1
),但打印一条消息,例如NoMatch
file1 的第一个条目与 的第一个条目不匹配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
保存$1
,seen[$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提取结果:sort
join
sort
file2
{ 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