短くて一般的な質問:Unix / Linuxの大容量テキストファイルで複数の(〜150)文字列のリストを見つけるための最良の方法は何ですか?
私は私の特定の状況に合った解決策を見つけることを望む一般的な質問で、すべてのUnix / Linuxオタクにこの質問をします。ちょっとした修正が必要だと思います。
IBM Unix System Services(USS)システムには、大きなテキストファイル(実際にはMVSデータセット)があります。サイズは約6GBのようです。
また、AAAAA形式の約150個の5文字識別子のリストがあり、このファイルでその識別子を見つける必要があります。つまり、ファイルから150個の特定の識別子の1つを含む行を抽出しようとします。私はそれを探しています。
大容量ファイルの各行形式は次のとおりです。
00000000000A00000000000000000AAAAA\n
ここで、0 は数値を表し、A は英数字を表します。私が探している文字列は常に行の末尾にあります。
USSでデータセットを使用するのは少しぎこちないようで、容量が大きすぎてUnix環境にはコピーできません。標準のUnixユーティリティがすべてデータセット(たとえばdd)で動作するわけではありません。しかし、sed、awk、およびgrepはある程度動作するようです(コマンドラインスイッチは少し異なるようです)。
次のようにデータセットをgrepできます。
cat "//'MVS.DATASET'" | grep -e"LOOKFOR1" -e"LOOKFOR2" -e"LOOKFOR3" > output_to_file.txt
ただし、1行の150項目をすべて把握することはできません。分割して数回実行することはできますが、より良い方法が必要だと思います。
以下のスクリプトでsedを試してみましたが、sedをまったく知らず、「コマンド後のガベージ」というエラーが発生しました。 sed-script.txtファイルに次の内容を保存しました。
s/AAA01/&/p
s/AAA30/&/p
s/AAA10/&/p
... etc ...
それから逃げた。sed -f sed-script.txt "//'MVS.DATASET'"
繰り返しますが、「sed:FSUM7294コマンド後のガベージ」のため失敗します。
したがって、1.「一般的な」Unix環境では、この問題は通常どのように解決されますか? 2. この特定の事例に対する具体的な洞察力はありますか?
答え1
grep
ファイルからパターンをインポートすることをサポートします-f
。固定文字列(-F
)も指定するとより効率的です。
grep -F -f patterns.txt "//'MVS.DATASET'"
答え2
まず、150個の5文字の文字列のリストをファイルに保存してから、ループを実行してパターンを見つけることができます。
for i in `cat file`
do
cat mvsfile | grep -i $i >> matched_lines
done