Bash 具有两个文件输入的AWK-输出取决于两个输入文件之间的一致性

Bash 具有两个文件输入的AWK-输出取决于两个输入文件之间的一致性,bash,awk,Bash,Awk,这是一个很长的解释,但我认为问题对你们大家来说都很简单。下面是: 我有两个输入文件。其中一个看起来像这样: data.frq CHR SNP A1 A2 MAF NCHROBS 2 fa0 T C 0.2067 300 此文件存在于1000个文件夹中(/home/user/data/run1/data.frq到/home/user/data/run1000/data.frq),用于重复运行,并且特定于该运

这是一个很长的解释,但我认为问题对你们大家来说都很简单。下面是:

我有两个输入文件。其中一个看起来像这样:

data.frq
     CHR  SNP   A1   A2          MAF  NCHROBS
       2  fa0    T    C       0.2067      300
此文件存在于1000个文件夹中(
/home/user/data/run1/data.frq
/home/user/data/run1000/data.frq
),用于重复运行,并且特定于该运行

另一个:

1 G
2 G
3 T
4 G
5 T
6 G
7 T
8 G
9 T
10 T
11 T
12 C
13 A
14 G
15 G
...
1000 C
我需要做的是查看每个
data.frq
文件(上面的第一个输入文件),并报告
MAF
(在第5列中,值为0.2067)。到目前为止,我可以用这个AWK脚本完成这项工作:

awk 'FNR == 2 {print FILENAME, $5}' data/run*/data.frq | sort -V
其输出如下:

run-1/data/data.frq 0.91333
run-2/data/data.frq 0.94667
run-3/data/data.frq 0.93333
run-4/data/data.frq 0.8867
run-5/data/data.frq 0.88
run-6/data/data.frq 0.8267
run-7/data/data.frq 0.8533
run-8/data/data.frq 0.7133
run-9/data/data.frq 0.9
run-10/data/data.frq 0.8333
run-11/data/data.frq 0.7867
run-12/data/data.frq 0.86
run-13/data/data.frq 0.92667
run-14/data/data.frq 0.8867
run-15/data/data.frq 0.94
down to run-1000
到目前为止,这个输出非常好,但我不知道如何处理上面的第二个输入文件,并将其与第一个进行比较。如果输入2的第二列(在本例中,它是运行1的G)与输入1的第三列不同,我需要1-MAF(1-$5)。如果它们是一样的,我需要MAF($5)。所以基本上,我需要知道如何将if语句放入我的awk脚本中:

if $2 of file2 == $3 of file1, print $5 of file1
else print (1-$5) of file1
因此,对于上面的示例,它将打印0.7933(这是1-MAF,因为G!=T)


希望这对某些人来说是有意义的

我在这里假设“file2”的第一列(您没有其他名称)包含运行编号,以便您可以使用字符串连接计算相应的
data.frq
文件的名称:

frq = "run-" $1 "/data/data.frq"
(这里我使用的是示例输出,而不是问题描述。精度总是很有用:)

这基本上允许一个相当简单的
awk
程序。这里有一种可能性,有很多评论

awk '{
        # construct the filename for the data file
        frq = "run-" $1 "/data/data.frq"
        # read (and ignore) the first line
        getline tmp<frq
        # read the second line
        getline tmp<frq;
        # and split it into fields
        split(tmp, field)
        # Now do the computation
        if ($2 == field[3]) print frq, field[5]
        else print frq, 1 - field[5]
        # Close the input file so we don't run out of fd's
        close(frq)
     }' file2
awk'{
#构造数据文件的文件名
frq=“运行-“$1”/data/data.frq”
#阅读(并忽略)第一行

getline tmp我在这里假设“file2”的第一列(您没有其他名称)包含运行编号,以便您可以使用字符串连接计算相应的
data.frq
文件的名称:

frq = "run-" $1 "/data/data.frq"
(这里我使用的是示例输出,而不是问题描述。精度总是很有用:)

这基本上允许一个相当简单的
awk
程序

awk '{
        # construct the filename for the data file
        frq = "run-" $1 "/data/data.frq"
        # read (and ignore) the first line
        getline tmp<frq
        # read the second line
        getline tmp<frq;
        # and split it into fields
        split(tmp, field)
        # Now do the computation
        if ($2 == field[3]) print frq, field[5]
        else print frq, 1 - field[5]
        # Close the input file so we don't run out of fd's
        close(frq)
     }' file2
awk'{
#构造数据文件的文件名
frq=“运行-“$1”/data/data.frq”
#阅读(并忽略)第一行
getline tmp可能类似于以下内容(为清晰起见插入格式):

awk'NR==FNR{v[$1]=$2}
NR!=FNR{如果($2!=v[$1])
$3 = 1.0 - $3;
打印$1,$3
}'file2.txt可能类似于以下内容(为清晰起见插入格式):

awk'NR==FNR{v[$1]=$2}
NR!=FNR{如果($2!=v[$1])
$3 = 1.0 - $3;
打印$1,$3

}'file2.txt是一厢情愿的想法,还是在基因组学领域有一个巨大的awk编码器尚未开发的市场?;-)…我认为在使用awk之前,您必须将其中一个文件存储在数组中或合并文件,因为没有办法(我知道)要做
如果$2的file2==$3的file1,打印$5的file1
。祝你好运!@shelleter:有趣的营销建议:)这是一厢情愿的想法,还是awk编码器在基因组学领域有一个巨大的未开发的市场?;-)…我认为你必须在使用awk之前将其中一个文件存储在数组中或合并文件,因为没有办法(我知道)要做
如果file2的$2==file1的$3,打印file1的$5
。祝你好运!@sheller:有趣的营销建议:)+1看起来不错。也许有必要明确指出,
NR==FNR
意味着第一个块在第一个文件上运行(以及为什么)。此外,您可以在第一个块中使用
next
,而不是在第二个块中使用一个条件。@TomFenech我将添加一点关于NR/FNR的内容。关于
next
的观点是有效的,但我不完全确定它是否真的在效率方面有所提高-也可以完全在一个无条件块中使用额外的
if。给猫剥皮的方法通常不止一种。
cat
…我肯定没有双关语的意思。从效率的角度来看,我不是这个意思,只是检查两个相互排斥的条件对我来说很奇怪。我同意,完全是口味的问题。+1看起来不错。也许值得明确的是,
NR==FNR
意味着什么第一个块对第一个文件进行操作(以及原因)。此外,您可以在第一个块中使用
next
,而不是在第二个块中使用一个条件。@TomFenech我将添加一点关于NR/FNR的内容。关于
next
的观点是有效的,但我不完全确定它是否真的在效率方面有所提高-也可以完全在一个无条件块中使用额外的
if。给猫剥皮的方法通常不止一种,
cat
。我肯定这不是双关语。我不是说从效率的角度来看,我只是觉得检查两种相互排斥的条件很奇怪。我同意,这完全是口味的问题。谢谢!我运行得很好。我可能要求的另一件事是这是一种质量控制措施。你能让它在另外两列中从文件1和文件2输出$3吗?这样我们可以看到它们是否相同,如果它们相同,如果一切正常,值应该小于0.5。再次感谢,这非常有帮助。谢谢!我运行得很好。我还想说一件事ht请求是一种质量控制措施。你能让它在另外两列中从文件1和文件2输出$3吗?这样我们可以看到它们是否相同,如果相同,如果一切正常,值应该小于0.5。再次感谢,这非常有用。