파일 내용에서 로드한 다음 다른 파일에서 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
유틸리티 csvgrep
는csvkit, 여기서는 두 번째 필드( )가 다른 파일( )의 문자열과 일치하는 헤더 없는( -H
) CSV 파일 에서 모든 레코드를 추출하는 데 사용하고 있습니다 .All_events.csv
-c 2
-f BlockspamCLIs.txt
입력 파일은 헤더 없는 CSV 파일이므로 csvgrep
생성된 CSV 출력에 더미 헤더가 추가되어 제거됩니다. 또는 다른 명령을 tail
사용하여 첫 번째 행을 제거하고 나머지 행을 수정하지 않고 전달할 수도 있습니다 .sed 1d
CSV 인식 도구를 사용하므로 입력은 "단순" CSV 데이터로 제한되지 않고 쉼표, 따옴표 및 줄 바꿈이 포함된 필드가 포함된 입력도 처리할 수 있습니다.
이 방법은 파일이 DOS 텍스트 형식인 경우에도 작동합니다.