非分割フィールドの値を保持しながら、CSVファイル内の特定のフィールドを分割して複数の行に分散します。

非分割フィールドの値を保持しながら、CSVファイル内の特定のフィールドを分割して複数の行に分散します。

.csv次のファイルがあります。

IMSI,MSISDN,SUBCATEGY,EPCMMEHOST,EPCMMEREALM,EPCROAMSCH,PSROAMSCH,OINR,MSCNUMBER,VLRNUMBER,SGSNNUMBER,EPCAPNNAME,EPCAPNAMBRUP,EPCAPNAMBRDOWN,EPCAMBRUP,EPCAMBRDOWN,CHARGE,EPCCHARGCHRT
NAN,NAN,2,,,0,,0,,,,OLAP$DOLAP,200000000$2048000,400000000$2048000,200000000,400000000,5,5

$シンボルの前の部分は元の行に残り、後ろの部分はファイル内の他のフィールドが で同じ値を保持する直下に新しく作成された行に転送されるように、シンボルを含むすべてのフィールドを分割したいと思います。区切り文字が最初に見つかった行です。行の複数のフィールドに区切り文字が含まれている場合は、すべてのフィールドの「2番目」の部分が新しく作成された同じ行に転送されます。

上記の例では、出力は次のようになります。

IMSI,MSISDN,SUBCATEGY,EPCMMEHOST,EPCMMEREALM,EPCROAMSCH,PSROAMSCH,OINR,MSCNUMBER,VLRNUMBER,SGSNNUMBER,EPCAPNNAME,EPCAPNAMBRUP,EPCAPNAMBRDOWN,EPCAMBRUP,EPCAMBRDOWN,CHARGE,EPCCHARGCHRT
NAN,NAN,2,,,0,,0,,,,OLAP,200000000,400000000,200000000,400000000,5,5
NAN,NAN,2,,,0,,0,,,,DOLAP,2048000,2048000,200000000,400000000,5,5

ベストアンサー1

@Paul_Pedantが言及したポイントは実際にはタイプミスであり、フィールドも分割されるとOLAP$DOLAP仮定します。この場合、次のawk手順(と呼ばれるsplitfields.awk)が機能する可能性があります。

#/usr/bin/awk -f
{
    copy=0;

    for (i=1;i<=NF;i++)
    {
        j=index($i,"$");
        if (j>0)
        {
            fields[i]=substr($i,j+1);
            $i=substr($i,1,j-1);
            copy=1
        }
        else fields[i]=$i;
    }
    print;

    if (copy==1)
    {
        for (i=1;i<NF;i++) printf("%s%s",fields[i],OFS);
        printf("%s%s",fields[NF],ORS)
    }
}

電話してください。

user@host~$ awk -F, -v OFS="," -f splitfields.awk input.csv

スクリプトは各フィールドにシンボルがあることを確認し、さらに使用するために$フィールドを配列にコピーします。見つかったらfields、対応$するフィールド現在のラインが部品に縮小今後配列$の対応する項目がいっぱいにfieldsなると後ろにこれ$

この確認を行った後、(修正可能な)現在の行がとにかく印刷されます。また、フィールドにこのシンボルが含まれている場合は、配列の内容$で構成された新しい行がCSV形式で印刷されます。fields

おすすめ記事