вставить текущую дату в место пустого столбца (поля) файла


-1

У меня есть файл с четырьмя столбцами, разделенными "|" как показано ниже

23414|test doc for me||
32322|test doc for you|2004_12_03|
13454|test doc for all||2010_11_01

Я пытаюсь вставить текущую системную дату в пустые столбцы, чтобы выходные данные выглядели как

23414|test doc for me|2018_04_03|2018_04_03
32322|test doc for you|2004_12_03|2018_04_03
13454|test doc for all|2018_04_03|2010_11_01

ниже приведен код, который я пробовал

for file in `ls -rlt Added_to_* | awk '{print $9}'`
do
  now="$(date +'%Y/%m/%d')"
  echo "Running for: $file"
  awk -F'|' -v curr="$now" '{ 
    if( $3=="" || $4=="" ){ 
     if ( $3=="" ) { print "$curr"}
     if ( $4=="" ) { print "$curr"}
  }else  
     do_something ; 
  }' $file 
done

я отредактировал вопрос с кодом, я пытаюсь
Shrawan

+'%d/%m/%Y'не соответствует формату даты, который вы хотите, и что находится do_somethingв блоке else?
Муру

do_something может быть любым утверждением, например, как echo "do_something"
shrawan

Вы на год вперед!
Георгий

Ответы:


0

Во-первых, нет необходимости анализировать выходные данные lsили даже использовать цикл оболочки вообще - поскольку awkможет читать и обрабатывать список файлов.

Другая проблема заключается в том, как вы ссылаетесь на переданную переменную: $currпросто должно быть curr( $currбудет ссылаться на пронумерованное поле curr - если такая вещь существует). Также нет необходимости дважды проверять пустоту полей.

Так

awk -v curr="$now" '
  BEGIN{OFS=FS="|";} {for(i=3;i<=4;i++) {if ($i=="") $i=curr}} {print}
' Added_to_*

0

Мы используем регулярные выражения lookbehind / lookahead, чтобы сосредоточиться на POI (интересующие позиции), где произойдет замещение. Оказавшись там, мы помещаем текущую дату, используя Perl'sвстроенную localtimeфункцию. 3-е, 4-е и 5-е поля - это данные дня / мм / гг, к которым мы добавляем необходимые константы, чтобы получить сегодняшнюю дату. К году, который мы добавляем 1900, к 1 месяцу и 0 к дню,

perl -ple 's/\|\K(?=\||$)/join "_", map $_ + qw[1900 1 0][$a++%3], (localtime)[5,4,3]/eg'

-1
sed ":a;s/|\(|\|$\)/|$(date +%Y_%m_%d)\1/;ta"

как говорит Костас

должен помочь вам.

PS. Сожалею. Похоже, вы не используете двойную черту для разделения. Дай мне подумать...


sed ":a;s/|\(|\|$\)/|$(date +%Y_%m_%d)\1/;ta"
Костас

Ответ Costas должен решить вашу проблему.
Холмы Вечности

@ АлександрБогомяков, если комментарий Costas исправил ваш ответ, пожалуйста, уделите время его обновлению и не забудьте упомянуть автора исправления.
ddnomad

Не могли бы вы объяснить следующую команду sed ": a; s / | (| \ | $) / | $ (date +% Y_% m_% d) \ 1 /; ta"
Velu
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.