Awk 또는 대안을 사용하여 논리적 새 행을 순서대로 삽입

Awk 또는 대안을 사용하여 논리적 새 행을 순서대로 삽입

다음과 같은 형태의 원시 데이터 행 50개가 있습니다.

09-06-16 16:45:00 1100000000
09-06-16 17:00:00 1200000000
09-06-16 17:15:00 1300000000
09-06-16 17:30:00 1400000000
09-06- 16 17 :45:00 1500000000

명령을 사용하거나 시퀀스 끝에 새 줄을 추가하는 스크립트를 만들고 싶습니다. 데이터의 단일 행은 시간을 15분 간격으로 진행해야 하며 숫자도 100000000씩 늘리기를 원합니다. 하지만 데이터 생성을 시뮬레이션하기 위해 crontab 스크립트를 작성할 계획입니다. 따라서 날짜는 상황에 따라 변경될 수 있습니다. 값이 1500000000이면 1100000000으로 돌아가기를 원합니다.

나는 항상 50개의 데이터 포인트가 있도록 데이터의 첫 번째 행(내 수준에서는 더 많음)을 삭제하는 스크립트를 작성했습니다.

어떤 도움이라도 대단히 감사하겠습니다.

답변1

나는 perl이것을 사용하여 모든 것을 완료합니다.

perl -MTime::Piece -i -lne '
  print unless $. == 1; # remove first line
  if (eof) {
    ($t, $n) = /(.*) (.*)/;
    $t = Time::Piece->strptime($t, "%y-%m-%d %T") + 60*15;
    $n += 1e8; $n = 11e8 if $n > 15e8;
     print $t->strftime("%y-%m-%d %T $n")
  }' your-file

Time::Piece5.10에 추가되었습니다. 이전 버전의 경우 언제든지 다음을 사용할 수 있습니다 POSIX::mktime.

perl -MPOSIX -i -lne '
  print unless $. == 1; # remove first line
  if (eof) {
    ($y, $mo, $d, $h, $mi, $s , $n) = /(..)-(..)-(..) (..):(..):(..) (.*)/;
    $t = mktime($s, $mi, $h, $d, $mo-1, $y+100) + 60*15;
    $n += 1e8; $n = 11e8 if $n > 15e8;
    print strftime("%y-%m-%d %T $n", localtime $t)
  }'

관련 정보