日付に基づいて計算された値を含むファイルの先頭に1行を追加します。

日付に基づいて計算された値を含むファイルの先頭に1行を追加します。

私は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唯一の問題は、ファイルの末尾にテキストを追加し、最初の行エントリとして一番上にテキストを追加する必要があることです。

私のコードがターゲットファイルの最初の行に出力されるように、正しく理解/助けてください。

関連情報