
このような簡単なコマンドがあります。
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
コマンドと同じです。
答え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
の行は で繰り返されますNAMES
。IFS
(内部フィールド区切り文字)値に基づいて各行の値を区切ります。この例ではIFS
letter に設定しますq
。IFS
デフォルトは空白(空白文字、タブ文字、または改行文字)です。最初のフィールドは変数に割り当てられ、X
2番目のフィールドはに割り当てられ、Y
残りの行はに割り当てられますremainder
。また見なさい:ファイルの列を別の変数として読み込みます。(UNIX.SE)。
上記のソリューションには
IFS
仕様はありません。考えるフィールドはすでにスペースで区切られています。注:ファイルのフィールドにバックスラッシュが含まれている場合は、バックスラッシュがエスケープシーケンスとして解釈されないようにする必要が
NAMES
あります。read -r
read
この
... remainder || [[ -n ${remainder} ]]
セクションでは、2 つのタスクを処理します。追加フィールド(存在する場合)はに格納され、remainder
入力ファイルの最後の行が改行で終わらない場合\n
(read
EOFが発生したときにゼロ以外の終了コードを返す)を処理します。また見なさい:ファイルを1行ずつ読み、変数に値を割り当てます。(だから)。
grep
完全削除:awk -v X="$X" '$0 ~ $X {print $NF}' results.dat > "$Y".dat
この-v
オプションはawk
スクリプトで使用できる変数を定義しますawk
。