파일 #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 내용이 출력되어 인수로 한 줄씩 읽을 수 있을 것으로 기대합니다 grep -f patterns filestolookthrough.

내가 원하는 것은 $(find $(cat "$NAMES").csv)이름을 반복하여 결과 디렉터리의 이름을 한 줄씩 일치시킨 다음 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를 한 줄씩 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가 한 줄씩 포함되어 있으면 .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

관련 정보