ファイル列の値を介してコマンドを繰り返すには?

ファイル列の値を介してコマンドを繰り返すには?

このような簡単なコマンドがあります。

 grep 'X' results.dat | awk '{print $NF}'  > Y.dat

このコマンドを繰り返したいX~から列1そしてそれに対応するはい~から2列同じファイルの例えば。名前

NAMES ファイル形式は次のとおりです。

C11-C12     p01
C13-C14-C17 P02
etc ..

したがって、ループの最初の2つのステップは次のようになります。

grep 'C11-C12' results.dat | awk '{print $NF}'  > p01.dat
grep 'C13-C14-C17' results.dat | awk '{print $NF}'  > p02.dat

答え1

シェルで反復を必要としない解決策:

awk 'pass==1 {  Xpatt[NR] = $1; Yfile[NR] = $2 ".dat"; printf "" > Yfile[NR] }
     pass==2 {
                for (i in Xpatt) {
                        if ($0 ~ Xpatt[i]) print $NF > Yfile[i]
                }
             }' pass=1 NAMES pass=2 results.dat
  • まず、 awkを使用する代わりに、ファイル名と混在させることで、プログラムの後にコマンドライン引数として変数の割り当てを指定できます-v。これらの変数は、コマンドライン内の位置に応じて提案された処理シーケンスのポイントで実行されます。したがって、上記のコマンドでは

    1. pass1に設定、
    2. ファイルがNAMES処理されました。
    3. pass2に設定してから
    4. ファイルがresults.dat処理されました。

    pass=1-vブロックでaまたはsetを使用できると思いますBEGIN

    変数を使って、pass私が読んでいるファイルが何であるかを伝えます。これは通常NRと比較して行われますが、FNRファイルが空の場合はエラー表示が発生する可能性があります。

    (厳密に言えば、このスクリプトは両方のファイルが空であることを確認する必要があると思います。この場合は何もしません。)

  • (ファイルの読み込み中)pass==1ファイルの1列と2列(and)NAMESにXとYの値(パターンとファイル名)を保存します。出力ファイル()を生成します。これは、これを行わないと、ファイルに存在しないパターンの(空の)出力ファイルを取得できないためです。 (同意する場合は、この文章は省略してください。)$1$2Yfile[NR]results.datprintf
  • pass==2(ファイルの読み込み中results.dat)ファイルのパターンを繰り返しNAMES、パターンに一致する各行の最後の単語をそのファイルに印刷します。つまり、OPgrep X … | awk '{print $NF}' > Y.datコマンドと同じです。

答え2

すごい解決策:

while read X Y remainder || [[ -n ${Y} ]]; do
    awk -v X="$X" '$0 ~ $X {print $NF}' results.dat > "$Y".dat
done < NAMES
  • 通常、while IFS="q" read X Y remainder; do ...; done < NAMESの行は で繰り返されますNAMESIFS(内部フィールド区切り文字)値に基づいて各行の値を区切ります。この例ではIFSletter に設定しますqIFSデフォルトは空白(空白文字、タブ文字、または改行文字)です。最初のフィールドは変数に割り当てられ、X2番目のフィールドはに割り当てられ、Y残りの行はに割り当てられますremainder

    また見なさい:ファイルの列を別の変数として読み込みます。(UNIX.SE)。

    上記のソリューションにはIFS仕様はありません。考えるフィールドはすでにスペースで区切られています。

    注:ファイルのフィールドにバックスラッシュが含まれている場合は、バックスラッシュがエスケープシーケンスとして解釈されないようにする必要がNAMESあります。read -rread

  • この... remainder || [[ -n ${remainder} ]]セクションでは、2 つのタスクを処理します。追加フィールド(存在する場合)はに格納され、remainder入力ファイルの最後の行が改行で終わらない場合\nreadEOFが発生したときにゼロ以外の終了コードを返す)を処理します。

    また見なさい:ファイルを1行ずつ読み、変数に値を割り当てます。(だから)。

  • grep完全削除:awk -v X="$X" '$0 ~ $X {print $NF}' results.dat > "$Y".datこの-vオプションはawkスクリプトで使用できる変数を定義しますawk

関連情報