如何使用 awk 粘贴基于文件名的模式

如何使用 awk 粘贴基于文件名的模式

模板A.tsv

Name    data
B
C

以及几个要分析的文件,例如B.txt

#bla
#blabla
16  LSD

C.txt

#bla
#blabla
16  ARH

我想A.tsv根据LSD其他文件中是否存在添加 OK 或 KO:

Name    data
B   OK
C   KO

\t所有文件的字段分隔符都是制表符 ( )。如何用 awk 做到这一点?

我从 FILENAME 识别开始,但对其余部分没有任何线索:

template="A.tsv"
for bla in data/*.txt ; do
r="$(basename -s ".txt" $bla)"
( head -n 1 $template
awk -F'\t' -v OFS="\t" -v filename=$r  [..........] >> output_final.tsv;
done

答案1

awk '
  !last && /LSD/{seen[FILENAME]=1; nextfile;}
  last{
    if (FNR<2) print
    else print $1 "\t" ( seen[$1".txt"] ? "OK" : "KO" )
  }
' *.txt last=1 A.tsv

首先,Awk 读取未设置txt的文件last,并查找LSD匹配项。如果找到,它将文件名放入seen数组中(nextfile只是一种优化)。当它到达A.tsv文件时last,它会打印其标题并检查每个剩余行是否有相应的文件名,如果是则seen添加,如果不是则添加。<tab>OK<tab>KO

相关内容