在文件开头添加一行,其中包含根据日期计算的值

在文件开头添加一行,其中包含根据日期计算的值

我正在使用 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 个月的第一天),例如。今天的日期是 07/26/2017,我需要减去 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

下面是最终的脚本,它可以运行并将文本和日期(返回 9 个月并选择该月的第一天)输出到“solaris AIX”Kshell 上的文件中。

#!/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唯一的问题是我让它在文件末尾添加文本,而我需要将其添加到最顶部作为第一行项目。

请让我正确地了解/帮助我的代码,以便它将输出写入目标文件的第一行。

相关内容