내 경로에는 다음이 포함됩니다.
/home/user/data/foo/test_foo.gz
/home/user/data/bar/test_bar.gz
/home/user/data/fub/test_fub.gz
and so on...
모든 .gz 파일의 세 번째 줄을 인쇄하려고 합니다.
zcat /home/user/data/*/test_*.gz | sed -n '3p' > results
하지만 이것은 세 번째 행만 표시합니다.test_foo.gz
답변1
sed
예, 전송되는 스트림이 이러한 파일의 압축되지 않은 콘텐츠의 조합 zcat
이라는 것만 알 수 있기 때문입니다 .cat
gz
sed
여기에서 각 파일에 대해 하나씩 실행 해야 합니다 .
for file in /home/user/data/*/test_*.gz; do
{ zcat | sed '3!d;q'; } < "$file"
done > result
여기서는 세 번째 줄 이후에 종료하기 위해 sed '3!d;q'
for를 사용하므로 전체 파일의 압축 풀기가 완료되기 전에 중단할 수 있습니다.sed
zcat
{ a | b; } < file
열 수 없으면 실행되지 않거나 a
둘 다 실행되지 않는지 확인하세요 b
. file
에서는 a < file | b
실행을 a
건너뛰지만 에서는 건너뜁니다 b
. In ( 파일 자체를 열 수 있는 명령 a file | b
의 경우 ) 은 파일을 열 수 있는지 여부에 관계없이 시작됩니다.a
a
b
zgrep
최소한 데비안에서는 다음과 같이 할 수도 있습니다:
GREP=sed zgrep '3!d;q' /home/user/data/*/test_*.gz
zgrep
실제로 인수에 따라 실행되는 쉘 스크립트가 있습니다( zcat -f | $GREP
해당 옵션을 사용하지 않는 한 파일 이름 앞에 using을 붙입니다. 단, 옵션이 에 전달되고 지원되지 않기 때문에 여기에서 with를 사용하는 것은 작동하지 않습니다).sed
-h
-h
GREP=sed
$GREP
sed
답변2
당신의 파이프라인,
zcat /home/user/data/*/test_*.gz | sed -n '3p' > results
이 패턴과 일치하는 모든 파일의 내용을 스트림으로 추출한 다음, 여기에서 세 번째 줄을 추출합니다.
세 번째 행 가져오기각 파일의, 당신은 그것들을 반복해야 할 것입니다:
for pathname in /home/user/data/*/test_*.gz; do
zcat "$pathname" | sed -n 3p
done >results
zcat
이는 각 파일에 대해 한 번 , 그리고 sed
한 번(패턴이 일치한다고 가정) 호출됩니다 .
답변3
다음 명령으로 완료하세요 find
.
find path -type f -iname "*.gz" -exec bash -c "zcat {}|sed -n 'p'" \; >>results.txt