0

AWK でのスクリプトの書き込み - 入力データ - 時間形式31.12.2012. システム日付とこの日付の 2 つの日付を比較したい。最良の方法は、両方の日付を UNIX タイムスタンプに変換し、推論を行ってから条件付きで比較することだと思います。日付は、この形式でのみ UNIX タイムスタンプに変換できます2012-12-31。この形式に変換するには、 SED 式 を記述しますsed -n -e "s_\(..\)\(.\)\(..\)\(.\)\(....\)_\5-\3-\1_p"。そして、この式を command で変換する必要がありdate --utc --date "2012-12-31" +%sます。しかし、パイプは機能したくありません。

AWKで私は書いた:


#/usr/bin/awk -f
BEGIN {
    FS=",";
}
{
    split($3, account, "/");
    gsub(/ $/, "", account[1]);
    split($4, products, "\\\\n");
    split($5, supports, "\\\\n");
    for (i in products) {
        gsub("\"", "", products[i]);
        gsub("\"", "", supports[i]);
        split(supports[i], timesupport, "\ > ");
        "date +%s" | getline dateVal;
        print timesupport[1] | sed -n -e "s_\(..\)\(.\)\(..\)\(.\)\(....\)_\5-\3-\1_p" | getline timeVal1 | date --utc --date "timeVal1" +%s | getline timeVal;
        x=dateVal - timeVal;
        if (supports[i] !~ /n\\\\a*/ && supports[i] !~ /n\/a*/ && $2 !~ /\NULL/)
            print $1","$2","timesupport[1]","account[1]"\","products[i]"\","$6;

    }
}

メインスレッドは投稿 12634588 でした。ありがとう!

4

3 に答える 3

4

組み込みの時間関数を使用しない理由:

(echo | awk '{ print systime() }'; date +%s)
1348915323                
1348915323

言及した文字列を同じ形式に変換するには、次を使用しますmktime

{ 
  t = "31.12.2012"
  split(t, a, "\\.")
  ts = sprintf("%04d %02d %02d 00 00 00", a[3], a[2], a[1])
  print mktime(ts)
}

出力:

1356908400
于 2012-09-29T10:44:06.437 に答える
1

bash と awk コードを混在させようとしているようです。system() 呼び出しを使用して bash でコードを実行し、awk 内で結果を返すようにしてください。

于 2012-09-29T10:08:56.027 に答える
1

system()関数とコマンドはgetline実際に引数を に渡します/bin/sh。これにより、シェルと同じようにパイプを使用できます。例:

cmd = sprintf("echo '%s' | sed -e '...'", timesupport[1])
cmd | getline timeval

あなたの質問では、スクリプトへの入力が何であるかを正確に明確にすることはできないため、より適切な例を示すことはできません。

于 2012-09-29T10:10:17.737 に答える