このような簡単なコマンドがあります。
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
。これらの変数は、コマンドライン内の位置に応じて提案された処理シーケンスのポイントで実行されます。したがって、上記のコマンドではpass
1に設定、- ファイルが
NAMES
処理されました。 pass
2に設定してから- ファイルが
results.dat
処理されました。
pass=1
-v
ブロックでaまたはsetを使用できると思いますBEGIN
。変数を使って、
pass
私が読んでいるファイルが何であるかを伝えます。これは通常NR
と比較して行われますが、FNR
ファイルが空の場合はエラー表示が発生する可能性があります。(厳密に言えば、このスクリプトは両方のファイルが空であることを確認する必要があると思います。この場合は何もしません。)
- (ファイルの読み込み中)
pass==1
ファイルの1列と2列(and)NAMES
にXとYの値(パターンとファイル名)を保存します。出力ファイル()を生成します。これは、これを行わないと、ファイルに存在しないパターンの(空の)出力ファイルを取得できないためです。 (同意する場合は、この文章は省略してください。)$1
$2
Yfile[NR]
results.dat
printf
pass==2
(ファイルの読み込み中results.dat
)ファイルのパターンを繰り返しNAMES
、パターンに一致する各行の最後の単語をそのファイルに印刷します。つまり、OPgrep X … | awk '{print $NF}' > Y.dat
コマンドと同じです。