这个问题与this question密切相关。
有许多tsv文件包含这样的分类元素:
doc1.tsv
<http://uri.gbv.de/terminology/bk/86.56>
<http://uri.gbv.de/terminology/bk/58.28>另外还有一个包含类名的查找表:
lookup.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. LebensmittelrechtRaman Sailopal已经给出了一个非常好的解决方案的提示如下:
awk 'FNR==NR{ urls[$1]=$2 } FNR!=NR { print $1"\t"urls[$1] }' lookup.tsv doc1.tsv >> result.tsv不幸的是,该命令只将第一个字符串变为空白,但与"Gesundheitsrecht. Lebensmittelrecht“一样,整个文本也是必需的。还有什么要加的?
发布于 2020-11-18 20:40:53
您可以在循环表中保存$0而不是$2,因为您似乎想要打印整行。
$ awk 'FNR==NR { urls[$1]=$0 } FNR!=NR { print urls[$1] }' lookup.tsv doc1.tsv
<http://uri.gbv.de/terminology/bk/86.56> Gesundheitsrecht. Lebensmittelrecht
<http://uri.gbv.de/terminology/bk/58.28> Pharmazeutische Technologie发布于 2020-11-18 20:40:39
第一解决方案:用yoru显示的示例,请您试着用GNU awk编写并测试以下内容。
awk '
FNR==NR{
arr[$0]
next
}
match($0,/<.*> +/){
val=substr($0,RSTART,RLENGTH)
sub(/ +$/,"",val)
}
(val in arr)
' doc1 lookup第二个解决方案:只从doc2 Input_file尝试得到值,第一个解决方案将给出完整的行。
awk '
FNR==NR{
arr[$0]
next
}
match($0,/<.*> +/){
val=substr($0,RSTART,RLENGTH)
sub(/ +$/,"",val)
}
(val in arr){
print substr($0,RSTART+RLENGTH)
}
' doc1 lookup发布于 2020-11-18 20:43:27
您可能会使用grep -f
$ grep -Fwf doc1.tsv lookup.tsv
<http://uri.gbv.de/terminology/bk/58.28> Pharmazeutische Technologie
<http://uri.gbv.de/terminology/bk/86.56> Gesundheitsrecht. Lebensmittelrecht请注意,即使使用了-w,doc1.tsv中的行也将与lookup.tsv中的整行相匹配,而不是第一列。
https://stackoverflow.com/questions/64900957
复制相似问题