各行を一度に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変数で指定されたオフセットをoffs
3列目の3番目(ダッシュで区切られた)サブフィールドに追加し、変更されたサブフィールド値を印刷しますprintf
。コマンドを使用して、split
3番目の列を配列に分割して-
これを行いますdf
(日付フィールド)。
すべての行の代わりに特定の行に適用し、空の行がないと仮定するには、追加の変数を指定し、line
プログラムが自動ファイル固有の行カウンタを評価してその行のみを選択するようにします。FNR
awk
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 .....)