首页 > 解决方案 > 将查找文件中的信息写入另一个文件

问题描述

有一个包含以下内容的文件目录:

doc1.tsv

<http://uri.gbv.de/terminology/bk/86.56> 
<http://uri.gbv.de/terminology/bk/58.28>

doc2.tsv

<http://uri.gbv.de/terminology/bk/44.43> 
<http://uri.gbv.de/terminology/bk/58.28> 
<http://uri.gbv.de/terminology/bk/44.38>

此外,还有一个查找文件 vocab.tsv,其中包含与数字编码相关的类名:

<http://uri.gbv.de/terminology/bk/44.38>        Pharmakologie
<http://uri.gbv.de/terminology/bk/44.43>        Medizinische Mikrobiologie
<http://uri.gbv.de/terminology/bk/58.28>        Pharmazeutische Technologie
<http://uri.gbv.de/terminology/bk/86.56>        Gesundheitsrecht. Lebensmittelrecht

(分隔符应该是一个制表符,但可以是未定义的。)

如何使用它们各自的类名扩展上述文件?

结果应如下所示:

doc1.tsv

<http://uri.gbv.de/terminology/bk/86.56>        Gesundheitsrecht. Lebensmittelrecht 
<http://uri.gbv.de/terminology/bk/58.28>        Pharmazeutische Technologie

doc2.tsv

<http://uri.gbv.de/terminology/bk/44.43>        Medizinische Mikrobiologie 
<http://uri.gbv.de/terminology/bk/58.28>        Pharmazeutische Technologie 
<http://uri.gbv.de/terminology/bk/44.38>        Pharmakologie

到目前为止的不雅方法:

for tsv in *.tsv ; do

    while IFS='' read -r LINE || [ -n "${LINE}" ]; do
        
        newLine=$(grep "${LINE}" vocab.tsv)

        sed -i 's/${LINE}/$newLine/g' $tsv
    done < $tsv

done

但结果完全是胡说八道:

<http://uri.gbv.de/terminology/bk/<http://uri.gbv.de/terminology/bk/44.43> > 
<http://uri.gbv.de/terminology/bk/<http://uri.gbv.de/terminology/bk/58.28> > 
<http://uri.gbv.de/terminology/bk/<http://uri.gbv.de/terminology/bk/44.38> > 
<http://uri.gbv.de/terminology/bk/44.43> 
<http://uri.gbv.de/terminology/bk/58.28> 
<http://uri.gbv.de/terminology/bk/44.38>

对于初学者:在 bash 上完美运行的 grep 命令在脚本中运行时会删除类名。

有任何想法吗?

标签: bashshellfile

解决方案


awk -F "\t" 'FNR==NR{ urls[$1]=$2 } FNR!=NR { print $1"\t"urls[$1] }' lookupfile doc1.tsv

使用 awk 和 tab 作为字段分隔符,首先运行查找文件 (FNR==NR) 创建一个名为 urls 的数组,其中 url 作为索引,名称作为值。然后运行第二个文件。打印第一个制表符分隔字段以及相应 urls 数组条目中的值。


推荐阅读