sed
명령을 사용하여 일부 필터링을 수행 한 다음 결과를 파이프하여 gzip
출력을 다시 압축 하는 bash 스크립트가 있습니다 . 필터링된 출력의 형식은 <id>,<title>,<bool (0 or 1)>
id를 인쇄하고 싶지만 id가 증가함에 따라 둘 다 서로 인쇄하도록 개행 대신 후행 캐리지 리턴을 사용합니다. 내 접근 방식은 다음과 같습니다.
<chained sed commands> \
| tee >(sed -re "s/^([0-9]+).*/\1\r/") | gzip -c > outputfile.gz
그러나 이렇게 하면 각 줄에 줄 바꿈이 추가되며 단 한 줄에만 인쇄할 때 예상되는 결과가 생성되지 않습니다.
답변1
gzip으로 압축된 데이터에 표시되지 않도록 진행률 표시기를 stderr로 출력해야 합니다. 나는 이것을 사용할 것입니다 perl
:
<chained sed commands> | perl -pe 'print STDERR "$1\r" if /^(\d+)/' | gzip -c > outputfile.gz
perl -p
각 입력 라인(수정 가능)을 인쇄하는 자동 루프를 생성하는 것을 의미합니다. -e
루프 내에서 실행할 표현식을 정의합니다 .
이 표현식은 줄 시작 부분의 숫자와 일치하며, 발견되면 후행 캐리지 리턴과 함께 stderr에 인쇄합니다. 입력은 압축될 출력으로 전달됩니다.
시각적으로 더 보기 좋은 변형은 print 문 값을 로 바꾸는 것입니다 "\r$1 "\
. 이렇게 하면 커서가 끝에 남게 되며, 현재 ID가 이전 ID보다 작으면 추가 공백이 이전 줄의 모든 숫자를 덮어씁니다.