Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 用于比较两个文件并输出匹配值的脚本_Bash_Perl - Fatal编程技术网

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 | 参考文献|李子

我正在寻找一个脚本,用于比较两个以制表符分隔的文本文件并输出匹配值

我使用了这个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 |
参考文献|李子.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

  • 打印$1,$2,a[$1,$2]

    如果我们到了这里,我们正在处理第二个文件,file1。在这种情况下,我们打印第一个字段、第二个字段以及与这两个字段对应的
    a
    的值

  • OFS='|'

    这会将输出上的字段分隔符设置为
    |


您可以使用
join
(默认情况下使用第一个字段):


也许
diff
会起作用?在这里找脚本是错误的。这是一个寻找帮助编写脚本的地方。
join file1 file2