首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将查找文件中的信息写入另一个文件

将查找文件中的信息写入另一个文件
EN

Stack Overflow用户
提问于 2020-11-16 02:50:04
回答 2查看 51关注 0票数 0

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

doc1.tsv

代码语言:javascript
复制
<http://uri.gbv.de/terminology/bk/86.56> 
<http://uri.gbv.de/terminology/bk/58.28>

doc2.tsv

代码语言:javascript
复制
<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,其中包含与数字编码相关的类名:

代码语言:javascript
复制
<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

代码语言:javascript
复制
<http://uri.gbv.de/terminology/bk/86.56>        Gesundheitsrecht. Lebensmittelrecht 
<http://uri.gbv.de/terminology/bk/58.28>        Pharmazeutische Technologie

doc2.tsv

代码语言:javascript
复制
<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

到目前为止不优雅的方法:

代码语言:javascript
复制
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

但结果完全是胡说八道:

代码语言:javascript
复制
<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>

对于初学者: grep命令在bash上运行得很好,它在脚本中运行时会删除类名。

有什么想法吗?

EN

回答 2

Stack Overflow用户

发布于 2020-11-16 03:05:45

代码语言:javascript
复制
awk -F "\t" 'FNR==NR{ urls[$1]=$2 } FNR!=NR { print $1"\t"urls[$1] }' lookupfile doc1.tsv

使用awk和tab作为字段分隔符,遍历lookupfile first (FNR==NR)创建一个名为urls的数组,其中url作为索引,name作为值。然后浏览第二个文件。打印第一个制表符分隔的字段以及相应urls数组条目中的值。

票数 1
EN

Stack Overflow用户

发布于 2020-11-16 05:29:49

Raman Sailopal给出了部分答案

awk 'FNR==NR{ urls[$1]=$2 } FNR!=NR { print $1"\t"urls[$1] }' vocab.tsv oc1.tsv

为了对目录中的所有文件执行此操作:

代码语言:javascript
复制
for tsv in *.tsv ; do

    tsv2=${tsv%.tsv}.tsv2

    awk 'FNR==NR{ urls[$1]=$2 } FNR!=NR { print $1"\t"urls[$1] }' vocab.tsv $tsv >> $tsv2

done

当然,如果不使用.tsv2,它会更优雅。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64848448

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档