Добавление строки в начале файла со значениями, вычисленными с даты

Я использую Solaris O / S и новичок в UNIX и этот форум. Вот основные данные для 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 (sysdate – первый день 9 месяцев) 99991231

Для средней части (sysdate – первый день 9 месяцев), например. Сегодняшняя дата – 26.07.2017, мне нужно будет минус 9 месяцев, а затем первый день этого месяца. Смысл, мне нужно будет распечатать 20161001

В основном я напишу:

 MHHHRGFILE 20161001 99991231 

в первую строку файла test.txt где MHHHRGFILE и 99991231 постоянно остаются постоянными.

3 Solutions collect form web for “Добавление строки в начале файла со значениями, вычисленными с даты”

Дата 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))) 

ksh93

Если ksh доступен:

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

Perl

Если 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 

Вот и все.

Это не сложно сделать вручную:

 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 

Вот окончательный сценарий, который работает и выводит текст и дату (вернитесь 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 , это добавить текст MHHHRGFILE 20161001 99991231 в конце файла, в то время как мне нужно добавить его на верхнюю позицию в качестве первой позиции.

Пожалуйста, дайте мне знать / помогите моему коду правильно, чтобы он записывал вывод в первую строку целевого файла.

  • Построить матрицу на основе значений другой матрицы
  • Измените файл без создания другого файла
  • Извлечение определенных строк набора, соответствующих правилу
  • Получать среднее значение для всех строк каждые 3 столбца
  • Почему вы должны избегать «строго столбчатых» форматов ввода?
  • Сравнить 2 столбца в 2 разных файлах
  • Разделить данные из столбца
  • Помогите с пониманием регулярного выражения
  • Как ТОЛЬКО распечатать номер, который создается из du -sh / home?
  • Как извлекать уникальные значения в столбцах
  • Как создать список и подсчитать ключевые слова LaTeX в исходном файле?
  • Linux и Unix - лучшая ОС в мире.