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

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

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

 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コマンドと同じです。

おすすめ記事