ファイルの空の列(フィールド)位置に現在の日付を挿入します。

ファイルの空の列(フィールド)位置に現在の日付を挿入します。

次のように「|」で区切られた4つの列を持つファイルがあります。

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

答え1

まず、ファイルのリストを読み取って処理できるため、出力をまったく解析したり、lsシェルループを使用したりする必要はありません。awk

$curr別の問題は、渡された変数を参照する方法ですcurr$currフィールド番号 curr- そんなことがあったら)。また、フィールドが空であるかどうかを2回テストする必要はありません。

だから

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

答え2

我々は、置換が発生する関心位置(POI)に焦点を当てるためにLookbehind / lookahead正規表現を使用します。次に、Perl's組み込み関数を使用して現在の日付を配置しますlocaltime。 3番目、4番目、5番目のフィールドは、今日の日付を取得するために必要な定数を追加する日/月/年情報です。年に1 1900、月に1、日に0を加算します。

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

答え3

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

コスタスが言ったように

あなたを助ける必要があります。

PS。申し訳ありません。分割に二重ダッシュを使用しないようです。考えてみましょう...

関連情報