我正在搜索38个独立文件,以使用awk中的循环查找满足两个条件的数据点。我想打印第1列中的echo名称和输出文件test3.tsv的第2列中找到的数据点。
我试过这个循环和表达式语句。
filename=echo
for ID in {001..038}
do
echo "FLD0$ID"
cat /new-data/filtered/FLD0${ID}.filtered.tsv | awk '{ if($1 == "chr15" && $2 ==39074782 ) { OFS = "\t" ; print FILENAME, $4}}' >>/new-data/filtered/test3.tsv
done;
不幸的是我的输出文件test3.tsv看起来像:
- 37
- 45
- 96
- 10
- 21
- 75
我得到一个“ - ”而不是预期的FLD0001 ... FLD0038。我知道我可能会收到“ - ”因为没有提供特定的文件名。如何获取echo语句的输出以替换test3.tsv中的“ - ”?
答案 0 :(得分:1)
只需将文件名作为参数传递给awk,而不是将其内容传递给它:
for ID in {001..038}
do
echo "FLD0$ID"
awk '{if ($1 == "chr15" && $2 == 39074782) {OFS = "\t" ; print FILENAME, $4}}' /new-data/filtered/FLD0${ID}.filtered.tsv >>/new-data/filtered/test3.tsv
done
您还可以将OFS
的设置移动到BEGIN
块,以避免每次输出时都设置它:
for ID in {001..038}
do
echo "FLD0$ID"
awk 'BEGIN {OFS = "\t"} {if ($1 == "chr15" && $2 == 39074782) {print FILENAME, $4}}' /new-data/filtered/FLD0${ID}.filtered.tsv >>/new-data/filtered/test3.tsv
done