![如何使用两个文件中的公共键打印值,但在 awk 的特定列中](https://linux22.com/image/189633/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%E4%B8%A4%E4%B8%AA%E6%96%87%E4%BB%B6%E4%B8%AD%E7%9A%84%E5%85%AC%E5%85%B1%E9%94%AE%E6%89%93%E5%8D%B0%E5%80%BC%EF%BC%8C%E4%BD%86%E5%9C%A8%20awk%20%E7%9A%84%E7%89%B9%E5%AE%9A%E5%88%97%E4%B8%AD.png)
我有一个主文件 bla.tsv (FS= \t
):
id hub fil plop
34 ji ji
54 jo jo
46 ja ja
和一个信息文件 hub.csv (FS= ,
):
34,fuse
46,fose
我想将信息打印到这样的列hub.csv
中:hub
bla.tsv
id hub fil plop
34 fuse ji ji
54 jo jo
46 fose ja ja
我设法在正确的行中打印正确的信息,但在最后一个之后的列中:
awk -v OFS="\t" 'NR==FNR{a[$1]=$2;next}{print $0,a[$1]}' FS="," hub.csv FS="\t" bla.tsv > result.tsv
如何用在(如果有)bla.tsv
中找到的值填充第二列?hub.csv
请注意, 的结构bla.tsv
已经“正确”,即标题后的所有行中都有一个空的第二列(\t
ID 后连续两列)。
答案1
由于您的格式bla.tsv
已经正确,第二列为空,因此只需对您的方法进行最小程度的修改:
awk -v OFS="\t" 'NR==FNR{a[$1]=$2;next} ($1 in a){$2=a[$1]} 1' FS="," hub.csv FS="\t" bla.tsv > result.tsv
这将在处理时bla.tsv
检查 IDhub
在数组中是否有匹配的值a
。如果是这样,它将第二个字段设置为该值,通常打印当前行(包括所做的所有修改)。