我正在尝试比较2个文件中的值。对于Summits3.txt中的每一行,我想将第1列中的值定义为" Chr"然后在generef.txt中找到我的值为" Chr"在第2栏。 然后我想从generef.txt输出关于该行的一些信息到out.txt,然后重复直到结束。 我使用以下脚本:
#!/bin/bash
IFS=$'\n'
for i in $(cat Summits3.txt)
do
Chr=$(echo "$i" | awk '{print $1}')
awk -v var="$Chr" '{
if ($2==""'${Chr}'"")
print $2, $3
}' generef.txt > out.txt
done
它"工作"但它只比较了Summits3.txt最后一行的值。好像它没有循环通过awk位。
无论如何,请尽可能帮忙!
答案 0 :(得分:3)
我想你可能正在寻找这样的东西:
awk 'FNR == NR {a[$1]; next} $2 in a {print $2, $3}' Summits3.txt generef.txt > out.txt
基本上,您将第一个文件中的第一列读入数组(数组索引是您的chr,值是空字符),然后第二个文件只打印第二列位于数组索引集中的行。当前正在处理的文件中的FNR
行号,到目前为止所有已处理行的行号NR
。这是一个通用的查找命令,用于从另一个文件中提取基因或变体。
在上面的代码中,它应附加到out.txt:>> out.txt
。但是你必须确保在每次运行时重新设置out.txt。
答案 1 :(得分:0)
除了在循环中使用外部脚本(这是昂贵的)之外,我们首先看到的是您将输出重定向到循环中的文件。每次都会重新创建输出文件,因此请更改inte append(>>
)或更好地将重定向移到循环之外。
如果要使用循环,请尝试使用
while read -r Chr other; do
cut -d" " -f2,3 generef.txt | grep -E "^${Chr} "
done < Summits3.txt > out.txt
如果要避免循环(大输入文件需要),可以使用awk
或某些组合命令。
第一种解决方案可能会失败:
grep -f <(cut -d" " -f1 Summits3.txt) <(cut -d" " -f2,3 generef.txt)
你只需要完整字段Chr
的匹配,所以从第一个位置开始直到一个空格(我假设是field-sep)。
grep -f <(cut -d" " -f1 Summits3.txt| sed 's/.*/^& /') <(cut -d" " -f2,3 generef.txt)