일별 데이터가 있는데 이를 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
사용하여 다음을 수행할 수 있습니다.tail
xargs
printf
$ 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
. 이는 필요에 따라 조정될 수 있습니다.