50줄마다 15번째와 25번째 줄을 인쇄하려면 어떻게 해야 합니까?

50줄마다 15번째와 25번째 줄을 인쇄하려면 어떻게 해야 합니까?

대용량 파일이 있고 연속 50줄마다 인쇄하고 싶습니다.15일그리고25일철사.

sed -n '15,25p' inputfile

15행과 25행만 인쇄하고 파일의 50행마다 반복하도록 이 명령을 수정하려면 어떻게 해야 합니까?

답변1

awk 'NR % 50 == 15 || NR % 50 == 25'

분명히 휴대 가능합니다.

GNU sed대안을 참고하세요:

sed '15~50b;25~50b;d'

any를 사용하면 sed언제든지 다음을 수행할 수 있습니다.

sed -n 'n;n;n;n;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;p;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n;n'

(다음 줄을 14번 가져오고, 다음 줄을 10번 인쇄하고, 다음 줄을 25번 인쇄하고, 다음 루프로 돌아갑니다(누락된 추가 줄을 잡아 50번 생성)).

답변2

이건 직업이야awk

awk '(NR%50==15) || (NR%50==25)' inputfile

편집: OP의 sed 지시문에 오해를 받았습니다.

답변3

그리고perl

1) 솔루션과 유사하게 awk변수 $.는 줄 번호를 저장합니다.

$ seq 135 | perl -ne 'print if $.%50==15 || $.%50==25'
15
25
65
75
115
125

2) 라인 번호 목록을 비교하여 확장을 쉽게 합니다.

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25)'
15
25
65
75
115
125

$ seq 135 | perl -ne 'print if grep {$_==$.%50} (15,25,32)'
15
25
32
65
75
82
115
125
132

답변4

awk를 사용하는 또 다른 방법은 다음을 기반으로 합니다.샌딥의 생각목록을 사용하는 방법:

awk 'BEGIN { a[15] a[25] }; NR % 50 in a'

a인쇄할 행을 기반으로 배열의 키를 설정합니다. NR % 50배열의 키 중 하나와 일치하는 행을 인쇄합니다 .


user몇 가지 성능 지표를 제공하기 위해 이 접근 방식의 시간을 측정하고 3가지 실행 시간의 평균을 구하여 다른 답변과 비교했습니다 .

0.276초

$ time awk 'BEGIN { a[15] a[25] }; NR % 50 in a' <(seq 1000000) > /dev/null

0.374초

$ time awk 'NR % 50 == 15 || NR % 50 == 25' <(seq 1000000) > /dev/null

0.384초

$ time perl -ne 'print if $.%50==15 || $.%50==25' <(seq 1000000) > /dev/null

0.542초

$ time perl -ne 'print if grep {$_==$.%50} (15,25)' <(seq 1000000) > /dev/null

관련 정보