0

次の構文の入力ファイルがあります。

"ID","Company Name","AccountManager","Product","Support Type","Country"

例:

"1","Company one","Surname Name / Phone/ Cell Phone ","Product► (d2XXXXXX) ► Version","29.10.2012 ► Type of support","Singapore"

"2","Company two","Surname Name / Phone/ Cell Phone ","Product► (d2XXXXXX) ► Version\nProduct► (d2XXXXXX) ► Version\nProduct► (d2XXXXXX) ► Version","31.10.2012 ► Type of support\n28.10.2012 ► Type of support\nn/a ► Type of support","Indonesia"

"3","Company three","Surname Name / Phone/ Cell Phone ","Product► (d2XXXXXX) ► Version\nProduct► (d2XXXXXX) ► Version\nProduct► (d2XXXXXX) ► Version\nProduct► (d2XXXXXX) ► Version\nProduct► (d2XXXXXX) ► Version\nProduct► (d2XXXXXX) ► Version,"31.12.2012 ► Type of support\nType of support\nn\\a ► Type of support\n31.03.2013 ► Type of support\n25.10.2012 ► Type of support\nn\\a ► Type of support","USA"

最初の会社には1つの製品しかなく、2番目の会社には3つの製品があり、それらは\n(Product and Support Type)で区切られ、3番目の会社には6つの製品があります。

出力では、この文字列は個別であり、列の値を繰り返す必要があります。

"ID","Company Name","AccountManager","Country"、ただし"AccountManager"、名前と名前のみを含める必要があり、列のサポートタイプを今日の日付と比較する必要があります-サポートタイプの日付が今日の日付と27〜32日の値で異なる場合、この列は出力ファイルにある必要があります。サポートタイプを取得n/aしている場合は、見逃す必要があります。

出力は次のようになります。

"1","Company one","Surname Name","Product► (d2XXXXXX) ► Version","29.10.2012","Singapore"
"2","Company two","Surname Name","Product► (d2XXXXXX) ► Version","28.10.2012","Indonesia"
"2","Company two","Surname Name","Product► (d2XXXXXX) ► Version","31.10.2012","Indonesia"
"3","Company three","Surname Name","Product► (d2XXXXXX) ► Version","25.10.2012","USA"

どうすればbashでこれを行うことができますか?

4

1 に答える 1

2

「products.awk」と呼ばれる次のAWKスクリプトを使用して取得できます。

#/usr/bin/awk -f

BEGIN {
    FS=",";
    "date +\"%s\"" | getline curr_timestamp;
}

{
    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, " ");
        # ignore not available and support without date
        if (supports[i] !~ /n\\\\a*/ && supports[i] !~ /n\/a*/ && $2 !~ /\NULL/ && timesupport[1] ~ /[0-9][0-9].[0-9][0-9].[0-9][0-9][0-9][0-9]/) {
            # formatting date
            split(timesupport[1], date, "\.");
            mydate = "date -d \""date[3]"/"date[2]"/"date[1]"\" \"+%s\"";
            # date to timestamp (using bash)
            mydate | getline timestamp;
            # timestamp is >= 27 days and <= 32 days
            if ((timestamp-curr_timestamp) >= 2332800 && (timestamp-curr_timestamp) <= 2764800)
                print $1","$2","account[1]"\",\""products[i]"\",\""supports[i]"\","$6;
        }
    }
}

データがdata.txtというファイルにあるとすると、次の行を使用してbashからこのスクリプトを呼び出すことができます。

awk -f products.awk data.txt

サンプルファイルを使用して、スクリプトを実行して次の出力を取得しました。

"1","Company one","Surname Name","Product► (d2XXXXXX) ► Version","29.10.2012 ► Type of support","Singapore"
"2","Company two","Surname Name","Product► (d2XXXXXX) ► Version","31.10.2012 ► Type of support","Indonesia"
"2","Company two","Surname Name","Product► (d2XXXXXX) ► Version","28.10.2012 ► Type of support","Indonesia"

編集:

最後の行が>=27 && <= 32の条件に適合しないため、3行しか取得できません(今日は9月29日で、質問は9月28日に行われました)。

ついに手に入れた!!

于 2012-09-28T06:57:30.620 に答える