awk:如何使用条件找到的变量打印echo文件名

时间:2015-09-03 16:07:37

标签: loops printing awk filenames

我正在搜索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中的“ - ”?

1 个答案:

答案 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