Adicionando uma linha no início do arquivo com valores calculados a partir da data

1

Estou usando o Solaris O / S. Aqui estão as estatísticas básicas para UNIX O / S que estou usando:

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

Eu preciso escrever um texto na primeira linha de um arquivo de texto

test.txt

Texto que preciso adicionar à primeira linha em test.txt is

MHHHRGFILE (sysdate - primeiro dia de 9 meses) 99991231

Para parte do meio (sysdate - primeiro dia de 9 meses), por exemplo. A data de hoje é 26/07/2017, precisarei menos 9 meses e depois o primeiro dia do mês. Significado, vou precisar imprimir 20161001

Basicamente, vou acabar escrevendo:

MHHHRGFILE 20161001 99991231

para a primeira linha do arquivo test.txt , onde MHHHRGFILE e 99991231 permanecem constantes o tempo todo.

    
por user3519878 26.07.2017 / 22:40

3 respostas

2

Data do Solaris / Aix

Infelizmente, não há solução possível com (apenas) a data do Solaris / Aix.

data do GNU

Se a data do gnu estiver disponível:

Construa a data necessária em uma variável:

$ 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

Ou simplesmente:

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

Bash

Se o bash (4.2+) estiver disponível: (usando 272 dias como equivalente a 9 meses)

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

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

ksh93

Se o ksh estiver disponível:

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

Perl

Se perl estiver disponível (9 meses são aproximados com 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);')

Edite o arquivo

Anexe essa variável à primeira linha de file

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

É isso.

    
por 26.07.2017 / 23:04
1

Não é complicado fazer isso manualmente:

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
    
por 27.07.2017 / 12:07
0

Aqui está o script final que funciona e produz texto e data (volte 9 meses e escolhe o primeiro dia do mês) em um arquivo no "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

O único problema que estou tendo é adicionar o texto MHHHRGFILE 20161001 99991231 no final do arquivo, enquanto eu preciso adicioná-lo no topo como um item de primeira linha.

Por favor, deixe-me saber / ajudar o meu código corretamente, então ele grava a saída na primeira linha do arquivo de destino.

    
por 27.07.2017 / 20:57