ループの変数日付に年を追加する

ループの変数日付に年を追加する

各行を一度に1つずつ見て、日付である3番目の列を取得するコードがあります。

形式で日付を表示します04-04-2017。各行には異なる日付があり、その日付から5年を新しい変数に入れたいのdob_want2ですが、エラー日付は引き続き表示されます。

invalid date ‘'04-04-2017' -5 years’

このファイルの形式はtemp9_0.txt次のとおりです。

123 5555 04-04-2017
126 1234 25-11-2014
218 0023 13-06-2002

そしてecho "$dob_want"出力

04-04-2017

$dob_want明らかに日付として認識されません。この変数を日付として処理する方法に関するヘルプ提案がある場合は、大変感謝します。

dob_want=$(head -1 temp9_0.txt | awk '{print $3}')
echo "$dob_want"
dob_want2=$(date  +%d-%m-%y -d "$dob_want -5 years")
echo "$dob_want2"

答え1

dateあなたの場合、そのユーティリティが必要かどうかはわかりません。数年間、非常に簡単な作業をしたいからです(5年をyyyy除いてdd-mm-yyyy

この場合、次のawkプログラムは入力ファイルの3番目の列の日付を変更します。

~$ awk -v offs=-5 '{split($3,df,"-"); printf "%02d-%02d-%04d\n",df[1],df[2],df[3]+offs}' temp9_0.txt 
04-04-2012
25-11-2009
13-06-1997

as変数で指定されたオフセットをoffs3列目の3番目(ダッシュで区切られた)サブフィールドに追加し、変更されたサブフィールド値を印刷しますprintf。コマンドを使用して、split3番目の列を配列に分割して-これを行いますdf日付フィールド)。

すべての行の代わりに特定の行に適用し、空の行がないと仮定するには、追加の変数を指定し、lineプログラムが自動ファイル固有の行カウンタを評価してその行のみを選択するようにします。FNRawk

awk -v line=3 -v offs=-5 'FNR==line {split($3,df,"-"); printf "%02d-%02d-%04d",df[1],df[2],df[3]+offs}' temp9_0.txt

この出力は、次のようにコマンド置換によってシェル変数としてキャプチャできます。

dob_want2=$(awk -v line=3 .....)

関連情報