펄
perl -ne 'print if $.%3==1;$var=$_ if $.%3==2;print $_ . $var if $.%3==0' input.txt
여기서 아이디어는 %
라인 번호 $.
변수가있는 모듈로 연산자 를 사용 하여 어느 것이 첫 번째인지, 어떤 것이 매초마다, 어느 것이 세 번째 줄인지 알아내는 것입니다. 모든 세 번째 줄의 나머지는 0이고, 첫 번째와 두 번째 줄마다 해당하는 숫자가 있습니다.
테스트:
$ cat input.txt
gi_1234
My cat is blue.
I have a cat.
gi_5678
My dog is orange.
I also have a dog.
$ perl -ne 'print if $.%3==1;$var=$_ if $.%3==2;print $_ . $var if $.%3==0' input.txt
gi_1234
I have a cat.
My cat is blue.
gi_5678
I also have a dog.
My dog is orange.
사소한 개선
두 번째 줄을 변수에 저장하는 방식에는 결함이 있습니다. 마지막 행이 "두 번째"행인 경우, 즉 해당 행 번호의 나머지는 2입니까? My dog is orange
마지막 줄을 생략하면 내 및 DopeGhoti의 답변에 원래 코드가 인쇄되지 않습니다 . 두 경우 모두에 대한 해결책은 END{}
인쇄 후 임시 변수를 설정 해제하여 코드 블록 을 사용 하는 것입니다. 다시 말해:
$ awk 'NR%3 == 1 { print } NR%3 == 2 { delay=$0 } NR%3 == 0 { print; print delay;delay=""}END{print delay}' input.txt
과
$ perl -ne '$s=$_ if $.%3==2;print $_ . $s and $s="" if $.%3==0 or $.%3==1;END{print $s}' input.txt
이 방법으로 코드는 파일에서 3으로 나눌 수있는 행이 아니라 임의의 수의 행에 대해 작동합니다.
의견에 언급 된 문제에 대한 추가 수정
awk의 경우, 파일의 마지막 줄이 $에 대해 1의 출력을 생성하는 경우. % 3, 이전 코드 때문에 무조건 인쇄 빈 줄 바꿈을 출력하는 문제를 가지고 END{print delay}
있기 때문에, print
코멘트에 언급 된 기능은 항상에 작동하고 어떤 변수에 줄 바꿈을 추가합니다. perl
버전의 경우 -ne
플래그 print
기능으로 개행을 추가하지 않으므로이 문제가 발생 하지 않습니다.
그럼에도 불구하고 awk의 경우 수정 사항은 Dope Ghoti가 언급 한 것처럼 임시 변수의 길이를 확인하는 것입니다. 동일한 수정의 펄 버전은 다음과 같습니다.
$ perl -ne '$s=$_ if $.%3==2;print $_ . $s and $s="" if $.%3==0 or $.%3==1;END{print $s if length $s}' input.txt