다른 파일 목록의 문자열이 포함된 텍스트 파일에서 줄을 추출하는 방법은 무엇입니까? [복사]

다른 파일 목록의 문자열이 포함된 텍스트 파일에서 줄을 추출하는 방법은 무엇입니까? [복사]

도시 인구 정보가 포함된 파일이 있습니다. 이 도시의 하위 집합에 대한 이름 목록인 또 다른 파일이 있습니다. 두 번째 파일을 사용하여 첫 번째 파일에서 인구통계 정보를 선택하고 싶습니다. 어떻게 해야 합니까?

예:

파일 1:ma-towns.txt

Acton   Town    Middlesex   Open town meeting   21,924  1735  
Acushnet    Town    Bristol Open town meeting   10,303  1860  
Adams   Town    Berkshire   Representative town meeting 8,485   1778  
Agawam  City[4] Hampden Mayor-council   28,438  1855  
Alford  Town    Berkshire   Open town meeting   494 1773  
Amesbury    City    Essex   Mayor-council   16,283  1668  
Amherst Town    Hampshire   Representative town meeting 37,819  1775  

파일 2:town-list.txt

Acton  
Adams  
Agawam 

원하는 출력은

Acton   Town    Middlesex   Open town meeting   21,924  1735  
Adams   Town    Berkshire   Representative town meeting 8,485   1778  
Agawam  City[4] Hampden Mayor-council   28,438  1855   

기본적으로 말했듯이 해당 행에 파일 2의 문자열이 포함되어 있으면 해당 행을 추출하십시오.

답변1

grep -f <(sed 's/.*/\^&\\>/' town-list.txt) ma-towns.txt

설명하다:

grep -f filefile일치시킬 패턴 목록을 읽습니다 . ma-towns.txt의 패턴을 사용하여 목록에서 검색 합니다 town-list.txt. 각 행은 새로운 패턴, 즉 새로운 검색어로 간주됩니다.

sed그러나 그것만으로는 충분하지 않았기 때문에 다음과 같이 검색어 형식을 지정하기 위해 하나를 추가했습니다 .

^Acton\>
^Adams\>
^Agawam\>

^grep은 줄 시작 부분의 패턴에만 일치 하고 , \>grep은 해당 지점의 단어 끝과만 일치합니다.

이렇게 하면 검색어가 줄의 시작 부분(도시 이름이 있는 곳)만 확인하고 검색어는 도시 이름이 끝나는 곳에서 끝나야 합니다.


sed 명령 자체는 s형식의 (대체) 명령을 실행합니다 s/search/replace/.

검색어가 .*전체 줄과 일치합니다. 바꾸기(Replace), \^&\\>리터럴 문자로 바꾸고 ^원래 줄과 텍스트로 바꿉니다 \>.


이 답변은 다른 답변이 수행하지 않는 기능을 수행합니다.

  • 대시로 시작하거나 백슬래시가 포함된 도시 이름을 처리합니다(이럴 가능성은 낮지만 사용자가 입력하는 경우 예측할 수 없는 방식으로 스크립트를 중단하는 것을 원하지 않습니다). 두 답변 모두 도시 이름을 문자 그대로의 검색어가 아닌 정규식으로 처리합니다.
  • ma-towns.txt에 지정된 대로 원래 순서대로 마을을 출력합니다.
  • 더 나은 성과를 내다
  • 줄의 어느 곳이 아니라 줄의 시작 부분에서 도시 이름을 검색하세요.
  • 하위 문자열이 하나만 일치하면 도시는 일치하지 않습니다(예: Waterloowill not match Waterlooville).

답변2

그러면 다음 줄을 읽고 file2다음 을 file1사용하여 grep구문 분석합니다 .

while read line; do
  grep "${line}" file1
done < file2

관련 정보