次のようなbashスクリプトを修正しようとしています。
- ディレクトリ(RESULT_DIR)に移動
- リストファイル(Names.txt)で名前が一致するcsvファイルを探す
- 手順2のファイルで見つかった(Patterns.txt)に記載されているパターンに対してGrepを実行します。
- その出力を取得し、MatchingResults.txtに保存します。
これまで、「パラメータリストが長すぎます」というエラーが発生しました。しかし、この問題を解決する方法がわかりません。私が見たことがない間違いをした可能性があるので、どのように修正するのに役立ちます。
#! /usr/bin/env bash
RESULT_DIR="$HOME/.../Results/"
NAMES="$HOME/.../Names.txt"
PATTERNS="$HOME/.../Patterns.txt"
cd "$RESULT_DIR" && grep -f "$PATTERNS" $(find $(cat "$NAMES").csv) >> MatchingResults.txt
更新:私が意味するものをよりよく理解できるように、名前とパターンの外観は次のとおりです。これを逃してすみません!
"NAMES"
"O60333"
"P52209"
"Q8N2Z9"
"O00230"
"O00273"
"O00468"
"O75381"
"Q86V15"
"E7ERA6"
"Q96HA4"
"K7EPZ7"
"H3BM07"
"H0YBK5"
"G8JLG8"
"Q13148"
"O00187"
そして
"PATTERNS"
"R381P"
"T95A"
"E112K"
"R136G"
"R140Q"
"S149L"
"R173Q"
"S184A"
"E193G"
"V260M"
"P291L"
"H313Y"
"P328L"
RESULT_DIRのファイル名は「A12345.csv」と同じです。
cat "$NAMES"
上記のNames.txtの内容が出力され、引数で1行ずつ読み取ることができると期待しますgrep -f patterns filestolookthrough
。
私が望むのは、$(find $(cat "$NAMES").csv)
名前を繰り返して結果ディレクトリの名前を1行ずつ一致させ、その特定の一致grep -f pattern
ファイルの名前とのみ一致させることです。
私のエラー出力は次のとおりです。line 8: /usr/bin/find: Argument list too long
答え1
理想的には、次のような詳細と例を追加する必要があります。
(A)RESULT_DIR&NAMES&PATTERNSの内容
(B)cat "$NAMES"
出力されると
思われるもの$(find $(cat "$NAMES").csv)
[[重要::$ NAMESファイルのすべての名前に拡張子.csvが追加されるわけではありません! $NAMESファイルの最後のエントリだけが拡張子が.csvです! ]];
(D)正確なエラー出力は何ですか?
これらの詳細がない場合は、問題を推測して解決策を見つける必要があります。これらの詳細により、私たちは実際に解決策を見つけることができます。
質問の更新を待っている間に何が起こっているのかについての3つの推測があります。
(1)NAMESに行が多すぎるため、find
結果パラメータのリストが非常に長い可能性があります。
(2)NAMESは非常に少数の行を含み、find
非常に長いファイルのリストを生成することもできます。これは非常にgrep
長い引数のリストを取得します。
(3) PATTERNSにはラインが多すぎますが、その可能性はありません。
(4)結果は完全に異なる場合がありますが、質問を詳細に更新する必要があります。
OPアップデートによると、解決策は次のとおりです。
NAMESファイルにはすでに.csv拡張子が必要です。vim
元のリストを生成したスクリプトで編集するのは簡単です。これにより、誤ってcat
.csvを使用して最後のエントリに追加する必要がなくなります。
また、ファイルリストには引用符は必要ありません。
次にスキーマファイルしてはいけない必須テキストと一致しない引用符があります。
この変更により、スクリプトには削除された.csv
最後の行が含まれます。
cd "$RESULT_DIR" && grep -f "$PATTERNS" $(find $(cat "$NAMES")) >> MatchingResults.txt
NAMESが常にRESULT_DIR(または既知のディレクトリ)内にある場合は、PATHを1行ずつNAMESに含めることができますfind
。
この変更後、そのスクリプトの最後の行は次のようになります。
cd "$RESULT_DIR" && grep -f "$PATTERNS" $(cat "$NAMES") >> MatchingResults.txt
OPにパターンと名前の小さなリストを試してみることを提案します。これにより、xargs
パターンや名前に多すぎるパラメータを引き続き使用できます。
OPには、PATTERNS&NAMESのおおよその行数とスクリプトの実行時に正確なエラー出力をリストすることをお勧めします。
cat
更新:find
エラーが発生する長いリストから。この問題を解決する方法は次のとおりです。
cd "$RESULT_DIR" for fn in $(cat "$NAMES") #### "$NAMES にリストされているすべてのファイルを繰り返し、$NAMES ファイルに引用符がないことを確認します。 する grep -f "$PATTERNS" ${fn}.csv #### "$NAMES ファイルにすでに .csv が 1 行ずつ含まれている場合は、.csv を追加する必要はありません。そうでない場合は、ここに追加してください。" #grep -f "$PATTERNS" $(${fn}.csv 検索) "####"または$ NAMESのファイルのリストが$ RESULT_DIR内に直接配置されておらず、一部のサブディレクトリにある場合は、この回避策を使用してください。 完了 >> MatchingResults.txt
今、引数にエラーが発生する可能性のある方法もなく、find
方法もありません!find
答え2
私はこれがあなたが望むものだと思います。 $NAMESファイルが.csv拡張子を追加する必要があるファイル名であるとし、各ファイルに対してパターンマッチングを実行します。
cd "$RESULT_DIR" && sed 's/$/.csv/' "$NAMES" | xargs grep -Hf "$PATTERNS" >> MatchingResults.txt