도시 인구 정보가 포함된 파일이 있습니다. 이 도시의 하위 집합에 대한 이름 목록인 또 다른 파일이 있습니다. 두 번째 파일을 사용하여 첫 번째 파일에서 인구통계 정보를 선택하고 싶습니다. 어떻게 해야 합니까?
예:
파일 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 file
file
일치시킬 패턴 목록을 읽습니다 . ma-towns.txt
의 패턴을 사용하여 목록에서 검색 합니다 town-list.txt
. 각 행은 새로운 패턴, 즉 새로운 검색어로 간주됩니다.
sed
그러나 그것만으로는 충분하지 않았기 때문에 다음과 같이 검색어 형식을 지정하기 위해 하나를 추가했습니다 .
^Acton\>
^Adams\>
^Agawam\>
^
grep은 줄 시작 부분의 패턴에만 일치 하고 , \>
grep은 해당 지점의 단어 끝과만 일치합니다.
이렇게 하면 검색어가 줄의 시작 부분(도시 이름이 있는 곳)만 확인하고 검색어는 도시 이름이 끝나는 곳에서 끝나야 합니다.
sed 명령 자체는 s
형식의 (대체) 명령을 실행합니다 s/search/replace/
.
검색어가 .*
전체 줄과 일치합니다. 바꾸기(Replace), \^&\\>
리터럴 문자로 바꾸고 ^
원래 줄과 텍스트로 바꿉니다 \>
.
이 답변은 다른 답변이 수행하지 않는 기능을 수행합니다.
- 대시로 시작하거나 백슬래시가 포함된 도시 이름을 처리합니다(이럴 가능성은 낮지만 사용자가 입력하는 경우 예측할 수 없는 방식으로 스크립트를 중단하는 것을 원하지 않습니다). 두 답변 모두 도시 이름을 문자 그대로의 검색어가 아닌 정규식으로 처리합니다.
- ma-towns.txt에 지정된 대로 원래 순서대로 마을을 출력합니다.
- 더 나은 성과를 내다
- 줄의 어느 곳이 아니라 줄의 시작 부분에서 도시 이름을 검색하세요.
- 하위 문자열이 하나만 일치하면 도시는 일치하지 않습니다(예:
Waterloo
will not matchWaterlooville
).
답변2
그러면 다음 줄을 읽고 file2
다음 을 file1
사용하여 grep
구문 분석합니다 .
while read line; do
grep "${line}" file1
done < file2