각 행의 값을 n번 반복하는 방법은 무엇입니까? [복사]

각 행의 값을 n번 반복하는 방법은 무엇입니까? [복사]

일별 데이터가 있는데 이를 24시간 데이터에 복사하여 시간별 시간 간격에 대해 값을 동일하게 유지하고 싶습니다. 내 데이터는 다음과 같습니다.

day       Value
01/01/2012  2
01/02/2012  3

그런 다음 출력을 다음과 같이 원합니다.

Day   Value
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
01/01/2012  2
.
.
.

01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
01/02/2012  3
.
.
.

하루에 24번이죠.

답변1

사용 awk:

awk 'NR == 1 {print $0}; NR > 1 {for(i=0;i<24;i++) print $0}' InputFile

답변2

방법 1

위의 줄을 라는 파일에 넣으면 , 및 를 sample.txt사용하여 다음을 수행할 수 있습니다.tailxargsprintf

$ cat <(head -1 sample.txt) <(tail -n +2 sample.txt \
    | xargs -I{} printf "{}\n%.0s" {1..25})

세부 사항

다음과 같은 유형의 파일이 있다고 가정해 보겠습니다.

$ more sample.txt 
day       Value
01/01/2012  2
01/02/2012  3

head헤더 행은 다음 위치에 유지 됩니다 sample.txt.

$ head -1 sample.txt 
day       Value

tail다음을 수행하십시오.

$ tail -n +2 sample.txt
01/01/2012  2
01/02/2012  3

xargs파일에서 각 줄을 가져와 printf인쇄를 X번 호출하면 범위에 따라 {1..25}개수가 생성됩니다.

그것은 cat <(...) <(...)모든 것을 하나로 묶습니다.

방법 #2

형태는 첫 번째 것과 유사하지만 약간 다릅니다. 궁극적으로 출력을 구성하기 위해 서브셸을 사용하는 대신 cat단일 서브셸을 사용하여 개별 명령의 출력을 함께 연결합니다. 또한 while루프를 사용하여 입력 파일의 각 행을 반복하는 보다 전통적인 접근 방식을 사용합니다 sample.txt. 를 사용하여 두 번째 줄 이상을 잘라내는 동일한 기술을 다시 사용합니다 tail.

$ (head -1 sample.txt; while read i ; do seq 25 \
   | xargs -i -- echo $i ; done < <(tail -n +2 sample.txt))

형태는 다음과 같습니다.

$ ( ... ; while .... done <(tail ...) )

외부 괄호는 cat첫 번째 예와 동일한 작업을 수행하여 모든 출력을 하나로 묶습니다.

여러 파일

OP는 1000개 이상의 파일을 처리하는 데 사용할 수 있도록 이 솔루션을 수정하는 방법을 물었습니다. 예를 들어, 양식 래퍼 메서드 #1의 코드 블록은 다음과 같은 결과를 생성합니다.

#!/bin/bash

for file in *.txt; do
  cat <(head -1 $file) <(tail -n +2 $file | xargs -I{} printf "{}\n%.0s" {1..25}) | tee new_$file
done

그러면 이름이 지정된 모든 파일을 반복하여 *.txt이름이 지정된 파일에 기록됩니다 new_*.txt. 이는 필요에 따라 조정될 수 있습니다.

관련 정보