bash - 将查找文件中的信息写入另一个文件
问题描述
有一个包含以下内容的文件目录:
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 命令在脚本中运行时会删除类名。
有任何想法吗?
解决方案
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 数组条目中的值。