path.txt
일부 파일의 디렉터리 경로를 다음 줄로 포함하는 파일이 있습니다 .
../../data/first.gz
../../data/second.gz
나는 읽고 path.txt
, 각 줄을 읽고, 이 파일(.gz 파일)의 내용을 새 파일에 저장하고 싶습니다.
여기서 비슷한 질문을 찾았습니다awk 명령은 다른 파일의 내용을 포함하는 파일을 읽는 데 사용됩니다.그리고 이 코드(파일 이름이 내 데이터와 일치하도록 변경됨).
awk '{ while ((getline a < $0) > 0) print a }' path.txt >> newfile
저는 awk와 bash를 처음 사용합니다. zcat 등을 사용하여 zip 파일을 열고 내용을 newfile에 인쇄하기 위해 위 코드를 수정하는 방법을 모르겠습니다. 코드 수정이나 새 코드 제안을 도와줄 수 있는 사람이 있나요? 미리 감사드립니다.
답변1
with 사용 xargs
(이것은 및 옵션이 zcat
GNU 구현이라고 가정합니다):-r
-d
<path.txt xargs -rd'\n' zcat -- >>output
각 .gz 파일을 별도의 출력 파일로 출력 하려면 zcat
실제로 여기에서 셸 루프를 사용할 필요가 없으며 다음과 같이 인라인 스크립트를 호출하면 됩니다.
<infile xargs -rd'\n' -I{} sh -c 'zcat -- "$1" >output."${1##*/}"' xargs-sh {}
답변2
여기서는 필요하지 않습니다 awk
. 간단한 쉘 루프로 충분합니다.
while IFS= read -r gz; do
zcat < "$gz"
done < path.txt >> newfile
또는 각 파일을 자체 파일에 넣습니다.
while IFS= read -r gz; do
zcat < "$gz" > "${gz%.gz}.uncompressed"
done < path.txt
이렇게 하면 .gz
접미사(있는 경우)가 제거되고 .uncompressed
접미사가 추가되어 이름이 손상되지 않습니다 . 또한 기존 파일이 손상되지 않도록 옵션( )을 .gz
설정할 수도 있습니다 .noclobber
set -o noclobber
파일 이름을 인수로 전달하는 대신 리디렉션을 사용하면 zcat
해당 파일 이름으로 시작하는 파일 이름과 관련된 문제를 피할 수 -
있으며 입력 파일을 열 수 없는 경우 출력 파일이 생성되지도 않습니다.
답변3
간단한 접근 방법은 "cat"이 zcat
"connect"를 의미하므로 연결 zcat
하려면 파일 목록이 필요합니다.
zcat -- $(cat path.txt) > newfile
그러나 이것은 약간 위험합니다. 왜냐하면 path.txt에는 공백이 있는 경로가 포함될 수 있고 배쉬는 공백이 인수를 구분한다고 생각하기 때문입니다. 갑자기, ../path/to/My document.txt.gz
그것은 ../path/to/My
and 가 되고 document.txt.gz
, 둘 다 존재하지 않습니다!
IFS=$'\n'; zcat -- $(cat path.txt) > newfile
설정을 이 줄에만 적용하고 나머지 셸 세션에는 적용하지 않기를 원하기 때문입니다.
( IFS=$'\n'; zcat -- $(cat path.txt) > newfile )
명명된 파일은 *
현재 디렉터리에 숨겨져 있지 않은 모든 파일 이름으로 확장됩니다.
따라서 매개변수 구분 기호로 새 줄만 고려하고 와일드카드를 비활성화해야 한다고 쉘에 지시하고 싶습니다.
( IFS=$'\n'; set -o noglob; zcat -- $(cat path.txt) > newfile )
(그런데 파일 이름에는 개행 문자도 포함될 수 있지만 처리되지 않은 파일 목록을 기준으로 볼 때 이는 해결할 수 없는 문제라고 생각합니다.)
Stéphane이 지적했듯이 zsh
대신 for를 사용하여 bash
동일한 작업을 수행하는 더 짧은 방법이 있습니다 .
zcat -f -- ${(f)"$(<path.txt)"}
이것이 내 "홈" 쉘이기 때문에 다음과 zsh
같은 사실을 알게 되어 기뻤습니다 ${(f)"somestring"}
. 와 사실상 동일 하지만 파일 내용을 출력 할 필요가 없습니다 . 해당 기능은 쉘의 일부입니다.somestring
$(< path.txt)
$(cat path.txt)
cat