각 줄을 여러 번 반복


17

파일의 각 줄을 정해진 횟수만큼 반복하고 싶습니다.

예를 들어 각 줄을 네 번 반복하십시오.

a
b
c

된다 :

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

나는 약간의 검색을했고, 역행의 선을 따라 많은 질문과 답변이 있습니다.

C에서는이 작업을 수행하는 것이 쉽지만 기본 명령에 대해 더 많이 알고 있기 때문에 항상 이러한 종류의 일회용 던지기에 의존하지 않아도됩니다.

답변:


19
  • 펄 :

    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

1
awkfor반복 단 하나의 명령이있는 경우 괄호를 필요로하지. 그리고 perl당신이 사용하는 경우 간단 foreach루프 : for$i(0..3){print}.
manatwork

4
대체 펄 : perl -ne 'print(($_)x4)'. 또한 $linebash 버전에서 (반향으로) 인용해야합니다 .
derobert

필자의 경우 Windows 줄 끝이 필요했습니다. 여기에서 볼있듯이BEGIN { ORS="\r\n" }
The Red Pea

34

이것이 골프 경기 로 바뀌고 있는지 궁금합니다 .

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

설명:

sed의 p명령은 현재 행을 인쇄하는 것입니다. 기본 동작은 다음 줄로 이동하기 직전에 현재 줄을 인쇄하는 것입니다.-n 에서 끌 수 있도록해야합니다). 일부 오래된 sed에는 세미콜론이 없으므로 (제 생각에) 할 수 있습니다.sed -e p -e p -e p

Awk는 condition {action} 쌍으로 . 조치가 생략 된 경우 조건이 true를 리턴하면 기본값은 현재 행을 인쇄하는 것입니다. 많은 C와 같은 언어와 마찬가지로 Awk는 1사실로 취급 됩니다. 완전성을 위해 조건이 생략되면 각 레코드에 대해 조치가 실행됩니다.

많은 perl 함수는 "default"변수를 이용합니다. 이 하나의 라이너는 (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 $_;
}

1
+1이라면, 당신이이기는 것입니다 :) 1awk에서 정확히 무엇을 합니까? 속기 print $0?
terdon

3
Awk 문은 조건과 블록으로 구성되며 선택 사항이지만 하나만 있어야합니다. 기본 조건은 1(true)입니다. 기본 블록은 {print}입니다. 따라서이 명령문 1은 현재 라인 버퍼 ( {print}) 를 인쇄하는 것을 의미합니다 . ( {print}{print $0}거의 동일하다, qed.)
Arcege

나는 sed세미콜론을 명령 종료 자로 지원하지 않는 것을 들어 본 적이 없다 . 정말 그런 것이 있습니까?
와일드 카드


4

당신은 필요없이이 작업을 수행 할 수 있습니다 sed, perl또는 awk.

$ for i in `cat <file>` ; do seq <#> <#> | xargs -i -- echo $i ; done

또는 while 루프를 사용하십시오.

$ while read i ; do seq <#> <#> | xargs -i -- echo $i ; done < <file>

for 루프
$ for i in `cat sample.txt` ; do seq 1 3 | xargs -i -- echo $i ; done
a
a
a
b
b
b
c
c
c
while 루프
$ while read i; do seq 1 2| xargs -i -- echo $i;done < sample.txt
a
a
b
b
c
c

공백을 포함하는 모든 줄에서 for 루프 버전이 중단 될 것이라고 생각하므로 while 루프가 선호됩니다. 그렇지 않으면 쉘 솔루션에 빠지기 때문에 +1입니다.
evilsoup

@evilsoup-그렇습니다. 다른 Q & A에 게시 한 코드에서 다른 사람이 이것을 언급했습니다. 나는 이것이 while의 주요 이점이라고 생각합니다. while 루프는 $ IFS 구분 기호를 견딜 수 있으며 줄 끝에서 분할되는 반면 for는 $ IFS에서 분할됩니다.
slm

1

순전히 쉘 사용 :

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

누군가 예 --help를 선택하는 대신 문자열로 간주하는 방법을 알고 있습니까? [어디에 경우를 생각해 line이다 --help또는 다른 옵션]
user176581

예,yes -- --help
don_crissti

사용 yeshead이 "순수 쉘"되지 않은 수단
글렌 잭맨

1

이것은 당신을 위해 일할 수 있습니다 (GNU sed) :

sed 'h;:a;s/[^\n]\+/&/4;t;G;ba' file

각 줄을 4 번 반복합니다.

또는 원하는 경우 :

sed 'h;:a;s/\n/&/3;t;G;ba' file

각 줄을 3 번 더 반복합니다.


1

@potong의 답변은 빈 줄과 함께 작동하지 않으므로 다음 \+과 같이 *바꿔야합니다.

sed 'h;:a;s/[^\n]*/&/4;t;G;ba' file
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.