특정 csv 파일을 이름으로 필터링한 다음 두 번째 행을 단일 csv 파일로 추출하는 방법을 알아내려고 합니다. 파일을 찾은 다음 sed/awk와 같은 명령을 사용하여 파이프하여 필요한 줄을 추출하는 것이 좋은 생각인지 잘 모르겠습니다.
find -name "data.csv" | sed -n 2p > final.csv
고쳐 쓰다
Bash 스크립트에서 for 루프를 사용하면 원하는 출력이 생성되지만 모든 출력이 한 줄에 인쇄됩니다.
for OUTPUT in $(find -name "data.csv")
do
sed -n 2p $OUTPUT
done
당신의 제안을 도와주세요.
답변1
출력을 보면 find -name "data.csv"
이라는 파일의 전체 경로 이름이 인쇄되는 것을 볼 수 있습니다 data.csv
. 이것을 에 파이프하면 sed
입력의 두 번째 줄이 인쇄됩니다.
따라서 당신이 말하는 것은 "이것은 파일 목록입니다. 목록의 두 번째 파일을 알려주세요."라고 말하고 싶은 것은 "이것은 파일 목록입니다. 각 파일에 대해 두 번째 줄을 알려주세요"입니다. ." 이를 위해 을 사용하고 싶습니다 xargs
.
아마도 당신은
find -name "data.csv" -print0 | xargs -0 -n 1 sed -n 2p > final.csv
: 을 사용하여 파일 이름 사이의 구분 기호로 개행 대신 NUL 문자를 사용하고 이를 예상하도록 알려주는 것이 find -print0 | xargs -0
좋습니다 . 이렇게 하면 공백, 캐리지 리턴 또는 기타 이상한 문자가 포함된 파일 이름으로 인해 파이프라인이 복잡해지는 것을 방지할 수 있습니다.-print0
find
-0
xargs
일괄 처리를 시도하는 대신 -n 1
찾은 각 "data.csv" 파일에 대해 xargs
별도의 프로세스를 실행 하도록 지시 하므로 일반적으로 작업이 더 효율적입니다. sed
이 경우 실행하면
sed -n 2p file1 file2 file3
내부적으로 모든 입력 파일을 단일 입력 스트림으로 연결하고 해당 입력 스트림의 두 번째 줄을 인쇄합니다. 하지만 RTFM: 아마도 이 작업을 수행하지 않는 방법이 있을 것입니다 sed
. 하지만 저는 그것을 놓치고 있습니다.
답변2
검색 결과는 sed가 작업을 수행하는 데 필요한 파일 이름 목록입니다. 따라서 xargs를 사용하여 해당 목록에서 하나씩 sed를 실행하십시오. 그러나 파일 이름에는 공백과 개행 문자도 포함될 수 있으므로 파일 이름을 ASCII 0으로 구분하는 find의 "-print0" 옵션을 사용하는 것이 더 좋습니다. 또한 이러한 파일이 큰 경우 라인 2 이후에 중지하여 CPU 열을 절약할 수 있습니다. 그러면 다음을 얻게 됩니다:
find -name "data.csv" -print0 | xargs -0 -n 1 sed -n -e 2p -e 2q > final.csv
답변3
다음을 수행할 수 있습니다.
find -name "data.csv" | xargs -n 1 sed -n 2p >> final.csv
위의 방법은 >>
sed의 결과를 새로운 줄에서 Final.csv로 연결하는 대신 >
Final.csv의 내용을 sed의 출력으로 바꾸는 것입니다.