質問

こんにちは、特定のパターンに一致するファイルから行を削除したい 私が使用しているコードは

です
BEGIN {
       FS = "!";
       stopDate = "date +%Y%m%d%H%M%S";
       deletedLineCtr = 0;   #diagnostics counter, unused at this time
      }
      {
     if( $7 < stopDate )
          {
           deletedLineCtr++;
          }
      else
           print <*>
      }

コードには、ファイルに&quot;!&quot;という行があることが示されています。分離され、7番目のフィールドは日付yyyymmddhhmmss形式です。スクリプトは、日付がシステム日付よりも小さい行を削除します。しかし、これは機能しません。理由を教えていただけますか?

役に立ちましたか?

解決

awk(1)の割り当ては火曜日ですか?本当に、awk ?? :-)

わかりました、あなたが何を求めているのか正確にはわかりませんでしたので、推測しました。このawkプログラムは、現在の時刻を取得してから、ファイル内のすべての行を削除します。デバッグプリントを1つ残しました。

BEGIN {
  FS = "!"
  stopDate = strftime("%Y%m%d%H%M%S")
  print "now: ", stopDate
}
{ if ($7 >= stopDate) print 
$ cat t2.data
!!!!!!20080914233848
!!!!!!20090914233848
!!!!!!20100914233848
$ awk -f t2.awk < t2.data
now:  20090914234342
!!!!!!20100914233848
$ 
}

<*>

他のヒント

date を最初に呼び出して、フォーマットされた日付をパラメーターとして渡します。

awk -F'!' -v stopdate=$( date +%Y%m%d%H%M%S ) '
    $7 < stopdate { deletedLineCtr++; next }
    {print}
    END {do something with deletedLineCrt...}
'

おそらく、日付をstopDateにするには、dateコマンドを実行する必要があります(バックティックを使用する場合があります)。書かれたコードでstopDateを印刷した場合、数字の文字列ではなく、「日付+ ...」が含まれます。それが問題の根本原因です。

残念ながら...

バックティックがどのバージョンのawk(古いawk、新しいawk、GNU awk)でも機能するという証拠を見つけることができません。そのため、コードをPerlに移行する必要があります(Perlはもともと「awk-killer」として設計され、awkスクリプトをPerlに変換するための a2p がまだ含まれています)、または日付が設定されます。

@DigitalRossの答えを見ると、 gawk strftime()関数が必要なフォーマットを提供します(私がしたように 'info gawk'をチェックしてください)。

これを修正すると、正しい行が削除されるはずです。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top