ファイル#1のパターンリストで名前付きファイルを見つけ、その中でファイル#2で見つかったパターンを見つけます。

ファイル#1のパターンリストで名前付きファイルを見つけ、その中でファイル#2で見つかったパターンを見つけます。

次のようなbashスクリプトを修正しようとしています。

  1. ディレクトリ(RESULT_DIR)に移動
  2. リストファイル(Names.txt)で名前が一致するcsvファイルを探す
  3. 手順2のファイルで見つかった(Patterns.txt)に記載されているパターンに対してGrepを実行します。
  4. その出力を取得し、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

関連情報