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