![如何使用 awk 粘贴基于文件名的模式](https://linux22.com/image/186659/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20awk%20%E7%B2%98%E8%B4%B4%E5%9F%BA%E4%BA%8E%E6%96%87%E4%BB%B6%E5%90%8D%E7%9A%84%E6%A8%A1%E5%BC%8F.png)
模板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