複数の特定のパターンを含む行を抽出し、出力を別々の出力ファイルに保存します。

複数の特定のパターンを含む行を抽出し、出力を別々の出力ファイルに保存します。

ファイルが多いフォルダがあります.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列 #12 で始まる行1/1(awk正規表現のスラッシュは特殊文字なので、バックスラッシュでエスケープします。)ファイル2

上記のコードを参照してくださいファイル2除外するには、2つの行タイプ(#column#12で始まり、column#12で始まる)も含まれます。1/1ファイル2次の行から始めて、最初のブロックに#ステートメントを追加します。next/^#/{ print >"file1"; next }

また、優先順位は開始行から#最初に確認されるため、行の両方の条件が満たされている場合は最初の条件のみが考慮され、2番目の優先順位で確認する必要がある場合はブロックの順序を変更してください。


修正された質問に対する回答(各.vcfファイルを処理し、別々に出力を生成):

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

関連情報