awk 명령은 파일 경로가 다른 파일에 있는 파일을 읽습니다.

awk 명령은 파일 경로가 다른 파일에 있는 파일을 읽습니다.

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(이것은 및 옵션이 zcatGNU 구현이라고 가정합니다):-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설정할 수도 있습니다 .noclobberset -o noclobber

파일 이름을 인수로 전달하는 대신 리디렉션을 사용하면 zcat해당 파일 이름으로 시작하는 파일 이름과 관련된 문제를 피할 수 -있으며 입력 파일을 열 수 없는 경우 출력 파일이 생성되지도 않습니다.

답변3

간단한 접근 방법은 "cat"이 zcat"connect"를 의미하므로 연결 zcat하려면 파일 목록이 필요합니다.

zcat -- $(cat path.txt) > newfile

그러나 이것은 약간 위험합니다. 왜냐하면 path.txt에는 공백이 있는 경로가 포함될 수 있고 배쉬는 공백이 인수를 구분한다고 생각하기 때문입니다. 갑자기, ../path/to/My document.txt.gz그것은 ../path/to/Myand 가 되고 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

관련 정보