텍스트 파일에서 특정 줄과 특정 문자열을 포함하는 여러 줄을 추출하는 방법은 무엇입니까?

텍스트 파일에서 특정 줄과 특정 문자열을 포함하는 여러 줄을 추출하는 방법은 무엇입니까?

필요한 것보다 더 많은 데이터가 포함된 텍스트 파일 모음이 있습니다. 각 파일의 첫 번째 줄에는쉼표로 구분됨문자열은 다음과 같습니다.

stop_id,stop_code,stop_name,stop_desc,stop_lat,stop_lon,location_type,parent_station,zone_id

그런 다음 해당 키 아래에 모든 데이터가 있습니다. 이 데이터의 하위 집합을 새 텍스트 파일로 추출해야 해당 하위 집합을 사용할 수 있습니다(모든 데이터가 필요하지 않고 너무 많습니다).

이 명령을 사용하여 첫 번째 줄을 추출합니다.

sed -n '1p' source.txt > destination.txt

또한 이 명령을 사용하여 필요한 특정 줄을 추출합니다.

grep "string" source.txt > destination.txt

문제는 동일한 스크립트에서 두 명령을 모두 실행하면(거의 그대로, 줄 또는 로 구분됨 &&) grep출력이 sed출력을 덮어쓴다는 것입니다. 두 가지를 순차적으로 실행하고 두 가지의 결합된 출력을 얻으려면 어떻게 해야 합니까?

grep나는 더 복잡한 명령을 사용하여 한 줄을 찾은 다음 일련의 줄을 찾는 것과 관련하여 비슷한 문제를 발견했습니다 . 데이터를 추출해야 하는 각 파일의 첫 번째 줄이 다르기 때문에 여기서는 작동하지 않습니다.

이상적으로는 작업해야 하는 각 파일에 대해 실행할 수 있는 함수를 작성하고 싶지만 먼저 명령을 연결하고 출력을 결합해야 합니다.

답변1

sed이렇게 하면 두 가지 작업이 모두 수행됩니다(첫 번째 줄과 포함된 모든 줄 인쇄 string).

sed -n '1p; /string/p' source.txt > destination.txt

또는 더 긴 버전:

sed -n -e '1p' -e '/string/p' source.txt > destination.txt

답변2

grep출력을 추가하도록 변경 하면 됩니다 .

grep "string" source.txt >> destination.txt

답변3

이를 수행하는 방법에는 여러 가지가 있습니다. 단일 명령을 사용하여 다음과 같이 이 두 줄을 얻을 수 있습니다.@Cyrus의 sed솔루션은 정확히 그렇게 합니다.. 이를 수행할 수 있는 다른 도구는 다음과 같습니다.

awk 'NR==1 || /string/' source.txt > destination.txt
perl -ne 'print if /string/ || $. ==1' source.txt > destination.txt

물론 실행 중인 두 명령을 실행하고 두 번째 명령을 변경하여 파일에 추가할 수도 있습니다.Banjosa가 제안한대로. 또는 하위 셸에서 두 명령을 그룹화하고 하위 셸의 출력을 파일로 리디렉션할 수 있습니다.

(sed -n '1p' file; grep string file) source.txt > destination.txt

또는

{ sed -n '1p' file; grep string file; } source.txt > destination.txt

따라서 원하는 기능이 이들로부터 함수를 생성하는 것이라면 이를 쉘의 초기화 파일(예 ~/.bashrc: )에 추가하는 것만큼 간단합니다.

foo(){ sed -n '1p' file; grep string file; } 

이제 함수를 실행 foo하여 원하는 작업을 수행할 수 있습니다.

foo source.txt > destination.txt

관련 정보