한 줄에 여러 번 반복

한 줄에 여러 번 반복

파일의 각 줄이 고정된 횟수만큼 반복되기를 원합니다.

예를 들어, 각 줄은 4번 반복됩니다.

a
b
c

이 되다:

a
a
a
a
b
b
b
b
c
c
c
c

몇 가지 검색을 해보니 중복된 행을 단일 행으로 병합하는 것과 같은 반대 작업과 관련된 많은 질문과 답변이 있었고, 어쩌면 다시 인쇄하여 행을 두 배로 늘리는 것에 대한 질문도 있었습니다.

C에서는 이 작업을 수행하기가 쉽지만 기본 명령에 대해 더 많이 알고 싶기 때문에 항상 이러한 일회성 명령에 의존할 필요가 없었습니다.

답변1

이게 이렇게 변할지 궁금해골프성냥:

sed 'p;p;p' 
awk '1;1;1;1' 
perl -lpE 'say;say;say'   # if Paul McCartney and Michael Jackson were hackers...

설명하다:

sed의 명령 p은 현재 행을 인쇄하는 것입니다. 기본 동작은 다음 줄로 이동하기 전에 현재 줄을 인쇄하는 것입니다(이것이 바로 -nsed가 이를 끌 수 있도록 허용해야 하는 이유입니다). 일부 오래된 sed에는 세미콜론이 없었기 때문에 (내 생각에는) 다음을 수행해야 할 수도 있습니다.sed -e p -e p -e p

awk는 쌍으로 작동합니다 condition {action}. 이 작업을 생략하면 기본적으로 조건이 true를 반환하면 현재 줄이 인쇄됩니다. Awk는 많은 C 계열 언어와 마찬가지로 이를 1사실로 취급합니다. (완전성을 위해 조건이 생략되면 레코드별로 연산을 수행합니다.)

많은 Perl 함수는 "기본" 변수를 사용합니다. 다음 코드 줄은 동일합니다(perl 5.16에서).

$ perl -MO=Deparse -lpE 'say;say;say'
BEGIN { $/ = "\n"; $\ = "\n"; }
use feature 'current_sub', 'evalbytes', 'fc', 'say', 'state', 'switch', 'unicode_strings', 'unicode_eval';
LINE: while (defined($_ = <ARGV>)) {
    chomp $_;
    say $_;
    say $_;
    say $_;
}
continue {
    die "-p destination: $!\n" unless print $_;
}

답변2

  • 진주:

    perl -ne 'for$i(0..3){print}' file
    

    이것을 다음과 같이 추가해야합니다.논평멋지기 때문에 @derobert가 작성했습니다.

    perl -ne 'print "$_" x4'
    
  • awk변형:

    awk '{for(i=0;i<4;i++)print}' file
    
  • bash

    while read line; do for i in {1..4}; do echo "$line"; done; done < file
    

답변3

sed -n '{p;p;p;p;}' file

awk '{print;print;print;print;}' file

답변4

순수 쉘을 사용하십시오:

repeats=4
while read line; do yes $line|head --lines=$repeats; done < infile > outfile

관련 정보