한 줄씩 읽고 grep을 사용하여 cat을 실행합니다.

한 줄씩 읽고 grep을 사용하여 cat을 실행합니다.

파일 내용에서 로드한 다음 다른 파일에서 cat과 grep을 사용하는 스크립트를 작성 중입니다. 문제는 grep을 실행할 때 값이 표시되지 않는다는 것입니다. 명령을 수동으로 실행하면 데이터가 검색됩니다.

나는 동안을 사용했지만 문제는 동일합니다. output6.txt는 항상 비어 있습니다. echo 작동하는 것 같아서 grep 또는 cat 문제인 것 같습니다.

BlockspamCLIs.txt의 예 다음 값이 있습니다.

4412345 
441236 
2367890

All_events.csv 파일 예

1,441236,20220909120909,test
2,441237,20220909120909,test
3,441232,20220909120909,test
4,44136,20220909120909,test
5,2367890,20220909120909,test

출력으로 숫자가 포함된 CSV 파일을 검색, 저장 및 기록하고 싶습니다. 예를 들면 다음과 같습니다.

1,441236,20220909120909,test
5,2367890,20220909120909,test

내 스크립트:

for i in `cat BlockspamCLIs.txt`
do
   grep $i *_All_events.csv >> output6.txt
   
   echo $i
done

미리 감사드립니다.

답변1

첫 번째,이러한 작업을 수행하기 위해 쉘 스크립트를 사용하지 마십시오, 느리고 오류가 발생하기 쉽습니다. 어쨌든, grep원하는 것을 이미 수행하는 것이 가능합니다.

grep -f BlockspamCLIs.txt *_All_events.csv >> output6.txt

에서 man grep:

       -f FILE, --file=FILE
              Obtain patterns from FILE, one per line.   If  this  option  is
              used  multiple  times  or  is  combined  with the -e (--regexp)
              option, search for all patterns given.  The empty file contains
              zero patterns, and therefore matches nothing.

다음으로, 쉘 루프를 사용하여 파일 내용을 반복하는 경우,절대 이렇게 하지 마세요for i in $(cat file). 또한 다양한 문제를 피하기 위해 항상 변수를 인용해야 합니다. 예를 들어, 의 줄에 BlockspamCLIs.txt공백이 포함되어 있으면 명령이 작동하지 않습니다.

즉, 줄에 공백이나 쉘 와일드카드가 없으면 표시되는 명령이 작동합니다. 다음과 같이 작성하는 것이 좋습니다.

while IFS= read -r i; do
    grep -e "$i" -- *_All_events.csv >> output6.txt
    printf '%s\n' "$i"
done < BlockspamCLIs.txt

답변2

다음 작업을 수행하기 위해 특별히 제작된 도구를 사용하세요.

$ csvgrep -H -f BlockspamCLIs.txt -c 2 All_events.csv | tail -n +2
1,441236,20220909120909,test
5,2367890,20220909120909,test

유틸리티 csvgrepcsvkit, 여기서는 두 번째 필드( )가 다른 파일( )의 문자열과 일치하는 헤더 없는( -H) CSV 파일 에서 모든 레코드를 추출하는 데 사용하고 있습니다 .All_events.csv-c 2-f BlockspamCLIs.txt

입력 파일은 헤더 없는 CSV 파일이므로 csvgrep생성된 CSV 출력에 더미 헤더가 추가되어 제거됩니다. 또는 다른 명령을 tail사용하여 첫 번째 행을 제거하고 나머지 행을 수정하지 않고 전달할 수도 있습니다 .sed 1d

CSV 인식 도구를 사용하므로 입력은 "단순" CSV 데이터로 제한되지 않고 쉼표, 따옴표 및 줄 바꿈이 포함된 필드가 포함된 입력도 처리할 수 있습니다.

이 방법은 파일이 DOS 텍스트 형식인 경우에도 작동합니다.

관련 정보