날짜를 기준으로 계산된 값이 포함된 파일의 시작 부분에 한 줄을 추가합니다.

날짜를 기준으로 계산된 값이 포함된 파일의 시작 부분에 한 줄을 추가합니다.

저는 Solaris 운영 체제를 사용하고 있습니다. 사용 중인 UNIX O/SI에 대한 기본 통계는 다음과 같습니다.

$ oslevel
7.1.0.0
$ ps
      PID    TTY  TIME CMD
 10944546  pts/1  0:00 -ksh
 17563840  pts/1  0:00 ps
$

텍스트 파일의 첫 번째 줄에 텍스트를 써야 합니다.

test.txt

첫 번째 줄에 추가해야 할 텍스트 test.txt는 다음과 같습니다.

MHHHRGFILE(시스템 날짜-9개월의 첫 번째 날) 99991231

중간 부분(sysdate - 9월의 첫 번째 날)의 경우, 예: 오늘 날짜는 2017년 7월 26일이며 9개월과 그 달의 첫 번째 날을 빼야 합니다. 즉, 20161001을 인쇄해야 합니다.

기본적으로 나는 다음과 같이 글을 쓰게 될 것입니다:

MHHHRGFILE 20161001 99991231

파일의 첫 번째 줄로 이동합니다. test.txt여기서 MHHHRGFILE 및 99991231은 변경되지 않습니다.

답변1

Solaris/Aix 날짜

불행하게도 Solaris/Aix 날짜(만)는 해결책을 제공하지 않습니다.

GNU 날짜

GNU 날짜를 사용할 수 있는 경우:

변수에 원하는 날짜를 작성하십시오.

$ date +'%Y/%m/01 -9 months'
2017/07/01 -9 months
$ a=$(date +'%Y/%m/01 -9 months')
$ a=$(date -d "$a" +'%Y%m%d')
$ a='MHHHRGFILE ('"$a"') 99991231'
$ echo "$a"
MHHHRGFILE (20161001) 99991231

또는 간단하게:

$ a=$(date -d "$(date +'%Y/%m/01 -9 months')" +'%Y%m%d')
$ a='MHHHRGFILE ('"$a"') 99991231'

불다

bash(4.2+)를 사용할 수 있는 경우: (272일 사용은 9개월과 동일)

$ TZ=UTC0 printf '%(%Y%m01)T' $(($(date +'%s') - 3600*24*272))
20161001

$ a=$(TZ=UTC0 printf '%(%Y%m01)T' $(($(date +'%s') - 3600*24*272)))

크쉬 93

ksh를 사용할 수 있는 경우:

$ printf "%(%Y%m%d)T" "9 month ago"

진주

Perl을 사용할 수 있는 경우(9개월은 약 3600*24*30*9):

$ perl -e 'use POSIX qw(strftime); print strftime "%Y%m01",localtime(time()- 3600*24*30*9);'
20161001

$ a=$(perl -e 'use POSIX qw(strftime); print strftime "%Y%m01",localtime(time()- 3600*24*30*9);')

파일 편집

이 변수를 첫 번째 줄에 추가하세요.file

$ sed '1s/.*/&'"$a"'/' file >file.new; mv file.new file

그게 다야.

답변2

손으로 하는 것은 복잡하지 않습니다.

eval "$(date +'y=%Y m=%m')"
m=$((${m#0} - 9)) # need to strip the 0 for shells like bash or some 
                  # ash derivatives (but not ksh) that complain
                  # about an invalid 09 octal number in arithmetic
                  # expressions. Some date implementations support
                  # date +%-m, but that's not standard.
if [ "$m" -le 0 ]; then
  m=$((m + 12)) y=$((y - 1))
fi
if [ "$m" -lt 10 ]; then
  m=0$m # 0-pad single-digit numbers
fi
sed "1s/$/MHHHRGFILE $y${m}01 99991231/" < file > newfile

답변3

다음은 "solaris AIX" Kshell의 파일에 텍스트와 날짜(9개월 반환 및 해당 월의 1일 선택)를 실행하고 출력하는 최종 스크립트입니다.

#!/bin/ksh

eval "$(date +'y=%Y m=%m')"
m=$((${m#0} - 9))

if [ "$m" -le 0 ]; then
  m=$((m + 12)) y=$((y - 1))
fi

echo "$m"
prvdt=$y${m}01
echo $prvdt
a='MHHHRGFILE '"$prvdt"' 99991231'
echo $a


var="$a"
echo $var
destdir=/applic/e396/data/NNA/Dclients_for_FPD.txt
echo 'Destination File is locate at' $destdir

echo $var >> $destdir

MHHHRGFILE 20161001 99991231유일한 문제는 파일 끝에 텍스트를 추가하고 첫 번째 줄 항목으로 맨 위에 텍스트를 추가해야 한다는 것입니다.

내 코드가 대상 파일의 첫 번째 줄에 출력되도록 제대로 이해/도와주세요.

관련 정보