단어 목록을 사용하여 다른 목록에 포함 시키십시오


8

250 줄의 목록이 있습니다. 출력 목록을 얻으려면 웹 서버를 통해 모든 것을 실행해야합니다. 그러나이 목록은 내가 관심있는 것보다 더 많은 행을 반환합니다 list.txt.

a.1
b.1
etc

출력은 다음과 output.txt같습니다.

a.1 a b c
a.2 b a b
a.3 d k o
b.1 b o p
b.2 o i y
b.3 p i y
etc

grep 명령을 사용하여 output.txt에서 list.txt의 모든 단어를 검색 한 다음 "원하는"목록 wanted.txt를 생성 할 수 있습니까? 스크립팅에 익숙하지 않은 output.txt에 전체 줄이 필요하지만 원하는 것은 다음과 같습니다.

grep list.txt output.txt > wanted.txt

나는 이것에 대한 예를 찾을 수 없었다


둘 다 예와 같이 알파벳 순서로되어 있습니까?
Oli

아니, 내 List.txt 파일의 특정의 비 알파벳 순서를 가지고 있지만 경우 output.txt 알파벳이지만, 나는 그것이 같은 비 알파벳 순서로 내 List.txt 파일에 대해서만은 "히트"를 포함하고 싶습니다
Ditte

답변:


11

나는 grep이것을 무시 합니다. 정규 표현식에는 좋지만 여기에 실제로 필요한 것처럼 보이지는 않습니다. comm두 파일을 비교하고 교차로를 표시 할 수 있습니다. 정확한 예를 사용하여 :

$ comm -12 list.txt output.txt 
a.1
b.1
etc

이것은 grep보다 빠르지 만 정렬되는 파일에 크게 의존합니다. 그렇지 않은 경우 미리 정렬 할 수 있지만 출력이 정렬되어 정렬됩니다.

comm -12 <(sort list.txt) <(sort output.txt) 

또는 iiSeymour 의이 답변 을 사용 하여을 수행 할 수 있습니다 grep. 플래그는 입력 파일을 요청하고 고정 문자열 전체 단어 검색을 강제합니다. 주문에 의존하지는 않지만 주문을 기반으로합니다 output.txt. list.txt 순서대로 파일을 원하는 경우 파일을 되 돌리십시오.

$ grep -wFf list.txt output.txt 
a.1
b.1
etc

당신 list.txt정말로 큰 경우, 당신은 이것을 조금 더 반복적으로 다루고 각 줄을 개별적으로 grep하기 위해 전달해야 할 수도 있습니다. 처리 시간이 크게 늘어납니다. 위의 내용은 한 output.txt번만 읽었 지만이 방법으로 모든 list.txt 줄마다 읽고 처리합니다. 끔찍한 일이지만 ... 당신의 유일한 선택 일 수도 있습니다. 거꾸로, 그것은 list.txt순서대로 물건을 정렬합니다 .

$ while read line; do grep -wF "$line" output.txt; done < list.txt
a.1
b.1
etc

1
정말 똑똑합니다! -12의 이유는 무엇입니까?
Ditte

3
-1첫 번째 파일에 -2고유 한 행을 표시하지 않고 두 번째 파일에 고유 한 -3행을 표시하지 않으며 두 파일에 공통 인 행을 표시하지 않습니다. 공통 라인을 얻기 위해 고유성을 억제하므로 -12.
Oli

좋은! comm 명령을 사용한다고 생각합니다. 그런 다음 list.txt와 동일한 순서로 output.txt를 정렬하려면 나중에 comm -12 <(sort list.txt) <(sort output.txt)를 사용합니까?
Ditte

comm 명령은 result.txt의 전체 줄을 제공하지 않았습니다 (그리고 거기에서 정보를 얻으려면 모두 필요합니다). 그러나 grep 명령을 시도하면 grep : out of memory로 저를 프롬 트합니다. 너무 큽니까?
Ditte

두 번째 예에는 중복 STDIN 경로 재 지정이 있으며 쉘은 오류로 플래그합니다. 임시 파일을 만들거나 파이프 라인에 배경 정렬이있는 여분의 fd를 사용하십시오 (대부분의 쉘에서는 까다 롭습니다) ... 이것은 스택 오버플로 에서 더 나은 프로그래밍 질문 입니다. 개인적으로, 나는 파이썬에서 이것을하고있을 것입니다.
Skaperen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.