質問
こんにちは、特定のパターンに一致するファイルから行を削除したい 私が使用しているコードは
です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'をチェックしてください)。
これを修正すると、正しい行が削除されるはずです。