このスクリプトは次のとおりです。
while read ACCT ; do
echo $ACCT
zgrep -h ^$ACCT datafile.0[2-3]2015.gz >>/tmp/$ACCT.txt
done < /account_list.txt
削除すると、リダイレクトされた出力ファイルが取得されず、'>>/tmp/$ACCT.txt'
出力が予想されるstdoutに移動します。この例では、リダイレクトされた出力が得られない理由を理解できません。私は代わりにzgrepを試しました...
zcat datafile.0[2-3]2015.gz|grep ^$ACCT>>/tmp/$ACCT.txt...
しかし、これは出力を生成しません。
答え1
どのデータが含まれているかを知らずに、コードスニペットをデバッグすることは困難です。だから私は^$ACCT
他のすべてのコードのように二重引用符で囲む必要があると言う以外に、コードに何が問題を抱えているかを推測しません$ACCT
。
zgrep
inの各行に対して1回呼び出す代わりにaccount_list.txt
(これらのデータファイルはファイル内の行数だけ解凍されます)、in配列でアカウントを読み取り、awk
一度に処理します。
awk 'NR==FNR { acct[$1]; next }
$1 in acct { file="/tmp/" $1 ".txt"; print >>file; close(file) }' \
account_list.txt <( zcat datafile.0[2-3]2015.gz )
これはbash
、プロセス置換を理解する別のシェルを想定しています。また、アカウントリストの最初の列にアカウント名が含まれており、データファイルに最初の列のアカウント名が含まれていると仮定します(実際にそのファイルがどのように見えるかを示していないため、これは有効です)。
最初のawk
ブロックは最初のファイルに対してのみ実行され、キーで抽出するアカウント名を含むaccount_list.txt
連想配列を生成します。acct
2番目のブロックは抽出されたデータファイルの行でのみ実行され、最初のフィールドがのキーに対応する場合、その行acct
は適切な名前のファイルに印刷されます。