Bash 用于比较两个文件并输出匹配值的脚本
我正在寻找一个脚本,用于比较两个以制表符分隔的文本文件并输出匹配值 我使用了这个bash脚本,但它只提供唯一的值(换句话说,它不能用于此目的)Bash 用于比较两个文件并输出匹配值的脚本,bash,perl,Bash,Perl,我正在寻找一个脚本,用于比较两个以制表符分隔的文本文件并输出匹配值 我使用了这个bash脚本,但它只提供唯一的值(换句话说,它不能用于此目的) grep-FwF file_1.txt file_2.txt>out.txt 文件1.txt ref|apple.1| 参考文献|苹果1 | 参考文献|苹果1 | 参考文献| peach.1 | 参考| peach.1| 参考| peach.1| 参考图1 参考文献| pear.1 | 参考文献| pear.1 | 参考文献|杏子1 | 参考文献|李子
grep-FwF file_1.txt file_2.txt>out.txt
文件1.txt
ref|apple.1|
参考文献|苹果1 |
参考文献|苹果1 |
参考文献| peach.1 |
参考| peach.1|
参考| peach.1|
参考图1
参考文献| pear.1 |
参考文献| pear.1 |
参考文献|杏子1 |
参考文献|李子.1 |
参考|葡萄1|
参考文献|葡萄1 |
参考文献|葡萄1 |
参考|葡萄1|
文件2.txt
ref | apple.1 |为山羊准备|
参考| peach.1 |为| tucans准备|
参考|图1 |为|皮耶贡准备|
参考文献|梨.1 |为|猪准备
参考文献|杏1 |为|羊准备的|
参考文献|李子.1 |为大猩猩准备|
参考|葡萄1 |为猴子准备的|
预期产量
ref | apple.1 |为山羊准备|
参考|苹果1 |为|山羊准备的|
参考|苹果1 |为|山羊准备的|
参考| peach.1 |为| tucans准备|
参考| peach.1 |为| tucans准备|
参考| peach.1 |为| tucans准备|
参考|图1 |为|皮耶贡准备|
参考文献|梨.1 |为|猪准备
参考文献|梨.1 |为|猪准备
参考文献|杏1 |为|羊准备的|
参考文献|李子.1 |为大猩猩准备|
参考|葡萄1 |为猴子准备的|
参考|葡萄1 |为猴子准备的|
参考|葡萄1 |为猴子准备的|
参考|葡萄1 |为猴子准备的|
grep
不会做你想做的事grep
is擅长选择文本,但不擅长混合和合并。相比之下,awk
是专为此任务设计的:
$ awk -F'|' 'FNR==NR{a[$1,$2]=$3; next} {print $1,$2,a[$1,$2]}' OFS='|' file2 file1
ref|apple.1| prepared_for_goats
ref|apple.1| prepared_for_goats
ref|apple.1| prepared_for_goats
ref|peach.1| prepared_for_tucans
ref|peach.1| prepared_for_tucans
ref|peach.1| prepared_for_tucans
ref|fig.1| prepared_for_piegons
ref|pear.1| prepared for_pigs
ref|pear.1| prepared for_pigs
ref|apricot.1| prepared_for_sheep
ref|plum.1| prepared_for_gorilla
ref|grape.1| prepared_for_monkeys
ref|grape.1| prepared_for_monkeys
ref|grape.1| prepared_for_monkeys
ref|grape.1| prepared_for_monkeys
(该问题的测试表明,字段是用制表符分隔的,但是示例文件显示了
作为分隔符。由于SO编辑器没有清楚地显示制表符,因此我保留了
作为此演示代码的分隔符。)
工作原理
将输入时的字段分隔符设置为-F'|'
|
由于条件FNR==NR{a[$1,$2]=3;next}
,这仅对第一个文件FNR==NR
执行。对于该文件,我们创建了关联数组file2
,它在前两个字段a
的键下存储第三个字段$1,$2
$3
如果我们到了这里,我们正在处理第二个文件,file1。在这种情况下,我们打印第一个字段、第二个字段以及与这两个字段对应的打印$1,$2,a[$1,$2]
的值a
这会将输出上的字段分隔符设置为OFS='|'
|
join
(默认情况下使用第一个字段):
也许
diff
会起作用?在这里找脚本是错误的。这是一个寻找帮助编写脚本的地方。
join file1 file2