짧고 일반적인 질문: Unix/Linux의 대용량 텍스트 파일에서 여러(~150) 문자열 목록을 찾는 가장 좋은 방법은 무엇입니까?
나는 내 특정 상황에 맞는 해결책을 찾을 수 있기를 바라는 일반적인 질문으로 모든 Unix/Linux 괴짜들에게 이 질문을 합니다. 약간의 수정이 필요하다고 생각합니다.
IBM USS(Unix System Services) 시스템에 큰 텍스트 파일(실제로는 MVS 데이터 세트)이 있습니다. 크기는 약 6GB인 것 같습니다.
또한 AAAAA 형식의 약 150개의 5자 식별자 목록이 있으며 이 파일에서 해당 식별자를 찾아야 합니다. 즉, 파일에서 150개의 특정 식별자 중 하나를 포함하는 행을 추출하려고 합니다. 나는 그것을 찾고 있다.
대용량 파일의 각 줄 형식은 다음과 같습니다.
00000000000A00000000000000000AAAAA\n
여기서 0은 숫자를 나타내고 A는 영숫자를 나타냅니다. 내가 찾고 있는 문자열은 항상 줄의 끝에 있습니다.
USS에서 데이터셋을 사용하기는 좀 어색한 것 같고, 용량이 너무 커서 유닉스 환경으로는 복사가 안되네요. 표준 Unix 유틸리티가 모두 데이터 세트(예: dd)에서 작동하는 것은 아닙니다. 그러나 sed, awk 및 grep은 어느 정도 작동하는 것 같습니다(명령줄 스위치는 약간 다른 것 같습니다).
다음과 같이 데이터 세트를 grep할 수 있습니다.
cat "//'MVS.DATASET'" | grep -e"LOOKFOR1" -e"LOOKFOR2" -e"LOOKFOR3" > output_to_file.txt
그러나 한 줄에 있는 150개 항목을 모두 파악하는 것은 허용되지 않습니다. 분할하여 몇 번 실행할 수는 있지만 더 나은 방법이 있어야 한다고 생각합니다.
아래 스크립트로 sed를 사용해 보았지만 sed를 전혀 모르고 "명령 후 가비지"라는 오류가 발생했습니다. sed-script.txt 파일에 다음 내용을 저장했습니다.
s/AAA01/&/p
s/AAA30/&/p
s/AAA10/&/p
... etc ...
그러다가 도망갔어sed -f sed-script.txt "//'MVS.DATASET'"
다시 말하지만 "sed: FSUM7294 명령 후 가비지"로 인해 실패합니다.
따라서 1. "일반적인" Unix 환경에서는 이 문제가 일반적으로 어떻게 해결됩니까? 2. 이 특정 사례에 대한 구체적인 통찰력이 있습니까?
답변1
grep
파일에서 패턴 가져오기를 지원합니다 -f
. 고정 문자열( -F
)도 지정하면 더 효율적입니다.
grep -F -f patterns.txt "//'MVS.DATASET'"
답변2
먼저 150개의 5자 문자열 목록을 파일에 저장한 다음 루프를 실행하여 패턴을 찾을 수 있습니다.
for i in `cat file`
do
cat mvsfile | grep -i $i >> matched_lines
done