圧縮ファイルセットでアカウント名を検索する(ファイルから読み取る)

圧縮ファイルセットでアカウント名を検索する(ファイルから読み取る)

このスクリプトは次のとおりです。

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


zgrepinの各行に対して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は適切な名前のファイルに印刷されます。

関連情報