我有一个包含很多.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