3

だから私は 1 週間逃したのでかなり迷っており、追いつくために遊んでいますが、2 つの日付の違いを日単位で伝える awk プログラムを作成する必要があります。

私は多かれ少なかれそれで終わりましたが、データ検証を行うときにユーザーが 01/01/YYYY を入力すると気に入りません。arg から 3 つのフィールドを取り出し、それらを関数に渡して検証します。

私に問題を引き起こしている部分は、私の検証では次のとおりです。

if ( day > Days[month] ){
invalid stuff here
}

ここDays[]で、[1]=31、[2]=28 (leap の場合は 29) などを保持する配列です。

Days[01] が定義されていないため、true になります。[01] を [1] と同じように定義することで回避できますが、もっとエレガントなものにしたいと思います。

awk プログラム内で変数 month の先頭のゼロを削除するにはどうすればよいですか? 私が見つけたものはすべてシェル スクリプトで使用するためのもので、awk を呼び出しますが、それはあまり役に立ちません。

助けてくれてありがとう!

4

5 に答える 5

6

変数が呼び出されると仮定すると、これが必要ですmonth

gsub ("^0*", "", month);

^開始アンカーで、0*0 個以上の0文字を意味します。したがって、これ0により、変数の先頭にあるすべての文字が効果的に削除されます。

例として(これは、日付を分割する前に、真ん中の数字にもそれを行う方法を示しています。そのためには2番目gsubを参照してください):

pax> echo '1/1/2013
03/12/2014
02/02/1965' | awk '{gsub ("^0*", "", $0); gsub ("/0*", "/", $0); print}'

1/1/2013
3/12/2014
2/2/1965
于 2013-03-20T05:18:54.570 に答える
2

@paxdiabloが提案した答えを試しました。最終的に、先頭以外のゼロも削除されました。

$ echo '20/02/1965' | awk '{gsub ("^0*", "", $0); gsub ("/0*", "/", $0); print}'
2/2/1965

sub代わりに使用するgsubとうまくいきました。

$ echo '20/02/1965' | awk '{sub ("^0*", "", $0); sub ("/0*", "/", $0); print}' 
20/2/1965
于 2015-07-22T12:35:46.140 に答える
-1

ごめんなさい。私の答えは awk に関するものではなく、bash 自体に関するものです。だから私のコメントにマイナスを付けないでください)

echo -e "00000000" | sed -r 's/^[0]*$/0/g' | sed -r 's/^0[0]+//g'

または (( )) 表記で整数計算を実行する

echo $((0000))
于 2014-04-18T16:13:17.637 に答える