提取包含多个特定模式的行并将输出保存到单独的输出文件中

提取包含多个特定模式的行并将输出保存到单独的输出文件中

我有一个包含很多.vcf文件的文件夹。我需要提取以 开头的所有行#并将它们保存在一个文件中,然后将第 12 列以 开头的所有行附加1/1到同一文件中。它应该为每个输入文件创建一个新的输出文件。

abc.vcf, def.vcf--> 过滤器 --> abcfiltered.vcf,deffiltered.vcf

我想了类似的事情,但不起作用:

printf '%s\0' *.vcf | xargs -0 -n 1 sh -c 'grep "#" "$1" > "candilist${1#case*}"' sh

这适用于第一个条件

我尝试添加这个命令

awk -F '\t' '$12~/^1/' "$1");

单独使用它们有效,但一起使用则不然。我猜是带有引号或括号的东西。

答案1

awk -F'\t' '
    /^#/          { print >"file1" }
    ($12 ~/^1\/1/){ print >"file2" }' ./*.vcf

这将保存所有以字符开头的 .vcf 文件中的行#进入文件1以及 column#12 开头的行1/1(awk 正则表达式中的斜杠是一个特殊字符,我们用反斜杠将其转义)分成单独的文件2

注意上面的代码中文件2将包含两种行类型(以 开头,#column#12 也以 开头1/1);如果想排除文件2从以下行开始,在第一个块中#添加语句。next/^#/{ print >"file1"; next }

另请注意,优先级是从开始的行开始的,#因为它首先进行检查,因此如果一行的两个条件都满足,则仅考虑第一个条件,如果您需要将其作为第二优先级进行检查,请重新排序块。


回答修订后的问题(处理每个 .vcf 文件并分别生成输出):

for file in ./*.vcf; do
    awk -F'\t' '
        /^#/          { print >(FILENAME"_1.procced") }
        ($12 ~/^1\/1/){ print >(FILENAME"_2.procced") }' "$file"
done

相关内容