0

以下を参照してください。このデータをフォーマットして、このデータをmysqlテーブルに挿入できるようにします。


  fdsfsfrerwrwrwr_Core             55000:10011608      ipv4        Vl1162
  xcvbdtykgjfhffghrfhfhffghCore    55000:10014478      ipv4        Vl1447
  675436346ore                     55000:1004868       ipv4
  545_Core                         55000:1004128       ipv4
  345235345                        55000:2728          ipv4
  534534e                          55000:1002108       ipv4        Vl2105
  C8567566756Core                  55000:10021038      ipv4        Vl2103
  C546346453554_Core               55000:2105898       ipv4        Vl664
                                                                   Vl896
  ewttt_WAN_Core                   55000:1007967       ipv4        Vl2552
  tetrewCore                       55000:1001708       ipv4        Vl905
  gsdgdsfgore                      55000:100106        ipv4
  65434533_Core                    55000:1009418       ipv4        Vl941
                                                                   Vl1028
  I2222222-11                      55000:10008         ipv4
  I666r555-12                      55000:20002         ipv4        Vl749
                                                                   Vl874
                                                                   Vl894
                                                                   Vl942
                                                                   Vl1172
                                                                   Vl1439
                                                                   Vl2553
  345345353Core                    55000:1004068       ipv4        Vl50
  5345345Core                      55000:1004498       ipv4        Vl617
  S534534                          55000:1002798       ipv4        Vl779
  534535335Core                    55000:1004278       ipv4
  test                             55000:500500        ipv4

このデータをmysqlデータベースに挿入できるように、AWKまたはその他のツールを使用して次のような結果を生成したいと考えています。次のAWKコマンドを使用しました。猫のサンプル.データ | awk '{print $1","$2","$3","$4}'


TEST1_Core,990010:10011608,ipv4,Vl1162
AA2_Autism_Core,990010:10014478,ipv4,Vl1447
6753312_Core,990010:1004868,ipv4,
542343423,990010:1004128,ipv4,
Bgdfdfgdf,990010:2728,ipv4,
gfgCore,990010:1002108,ipv4,Vl2105
fgdfgfgdfg_Core,990010:10021038,ipv4,Vl2103
42342342342342Core,990010:2105898,ipv4,Vl664

最後の列には、1 つのレコードに関連付けられた複数の行があることに注意してください。


  ghfghfhdfCore                    990010:1009418       ipv4        Vl941
                                                                   Vl1028
  hfghfghdf11                      990010:10008         ipv4
  yreyryer-12                      990010:20002         ipv4        Vl749
                                                                   Vl874
                                                                   Vl894
                                                                   Vl942
                                                                   Vl1172
                                                                   Vl1439
                                                                   Vl2553

結果を追跡できるように、最後の列を複数の行に変換するにはどうすればよいですか。


ghfghfhdfCore,990010:1009418,ipv4,Vl941 Vl1028
hfghfghdf11,990010:10008,ipv4,
yreyryer-12,990010:20002,ipv4,Vl749 Vl874 Vl894 Vl942 Vl1172 Vl1439 Vl2553

誰かが私を助けてくれるに違いないと確信しています。

4

4 に答える 4

1

後続の行に含まれるフィールドの数がわかるまで、行末の改行を出力しないでください。

awk -v OFS="," '{$1=$1;printf "%s%s",(NF>1?n:" "),$0;n=ORS}END{print ""}' file

例えば:

$ cat file
  ghfghfhdfCore                    990010:1009418       ipv4        Vl941
                                                                   Vl1028
  hfghfghdf11                      990010:10008         ipv4
  yreyryer-12                      990010:20002         ipv4        Vl749
                                                                   Vl874
                                                                   Vl894
                                                                   Vl942
                                                                   Vl1172
                                                                   Vl1439
                                                                   Vl2553

$ awk -v OFS="," '{$1=$1;printf "%s%s",(NF>1?n:" "),$0;n=ORS}END{print ""}' file
ghfghfhdfCore,990010:1009418,ipv4,Vl941 Vl1028
hfghfghdf11,990010:10008,ipv4
yreyryer-12,990010:20002,ipv4,Vl749 Vl874 Vl894 Vl942 Vl1172 Vl1439 Vl2553

フィールドが 3 つしかない行がいくつかあり、その場合は最後にコンマを追加する必要があることに気付きました。

$ awk -v OFS="," 'NF==3{sub(/$/,OFS)} {$1=$1;printf "%s%s",(NF>1?n:" "),$0;n=ORS} END{print ""}' file
ghfghfhdfCore,990010:1009418,ipv4,Vl941 Vl1028
hfghfghdf11,990010:10008,ipv4,
yreyryer-12,990010:20002,ipv4,Vl749 Vl874 Vl894 Vl942 Vl1172 Vl1439 Vl2553

フィールドが実際にタブで区切られている場合、または 3 番目のフィールドの後にスペースがある場合は、別の解決策があります。

于 2013-02-25T13:51:50.493 に答える
0

他のawkアプローチ、もう少し「ぎこちない方法」:

'NF>1{print line;line=$1 "," $2 "," $3 "," $4} NF==1{line=line " " $1}'
于 2013-02-26T12:38:34.783 に答える
0

「1つのタスクのみを実行するが、それをうまく実行するプログラムを使用する」という一般的なルールに従うことをお勧めします。それでは、データの一貫性を保つことから始めましょう。

sed -ne '1h;1!H;${;g;s/\n\s\+\(\S\+\)/,\1/g;p;}'

sedこれは、マルチラインを回すためのよく知られたワンライナーです。

今では、あらゆる方法でデータを操作することを妨げる可能性があるのはあなたのファンタジーだけです。

于 2013-02-25T13:56:13.360 に答える
0

これをやってみてください:

awk '
    BEGIN{OFMT="INSERT INTO `table` \
    VALUES(\n\t`%s`,\n\t`%s`,\n\t`%s`,\n\t`%s`\n);\n"
    }
    NF==3{printf OFMT, $1, $2, $3, $4v}
    NF==4{if (length(v)){printf OFMT, $1, $2, $3, $4v;v=""}
        else{printf OFMT, $1, $2, $3, $4}
    }
    NF==1{v=v","$1}
' file | mysql

なしで出力

    INSERT INTO `table`     VALUES(
        `TEST1_Core`,
        `990010:10011608`,
        `ipv4`,
        `Vl1162`
);
INSERT INTO `table`     VALUES(
        `AA2_Autism_Core`,
        `990010:10014478`,
        `ipv4`,
        `Vl1447`
);
INSERT INTO `table`     VALUES(
        `6753312_Core`,
        `990010:1004868`,
        `ipv4`,
        ``
);
INSERT INTO `table`     VALUES(
        `542343423`,
        `990010:1004128`,
        `ipv4`,
        ``
);
INSERT INTO `table`     VALUES(
        `Bgdfdfgdf`,
        `990010:2728`,
        `ipv4`,
        ``
);
INSERT INTO `table`     VALUES(
        `gfgCore`,
        `990010:1002108`,
        `ipv4`,
        `Vl2105`
);
INSERT INTO `table`     VALUES(
        `fgdfgfgdfg_Core`,
        `990010:10021038`,
        `ipv4`,
        `Vl2103`
);
INSERT INTO `table`     VALUES(
        `42342342342342Core`,
        `990010:2105898`,
        `ipv4`,
        `Vl664`
);
INSERT INTO `table`     VALUES(
        `24234234N_Core`,
        `990010:1007967`,
        `ipv4`,
        `Vl2552,Vl896`
);
INSERT INTO `table`     VALUES(
        `C86765Core`,
        `990010:1001708`,
        `ipv4`,
        `Vl905`
);
INSERT INTO `table`     VALUES(
        `Dhyhyh_Core`,
        `990010:100106`,
        `ipv4`,
        ``
);
INSERT INTO `table`     VALUES(
        `ghfghfhdfCore`,
        `990010:1009418`,
        `ipv4`,
        `Vl941`
);
INSERT INTO `table`     VALUES(
        `hfghfghdf11`,
        `990010:10008`,
        `ipv4`,
        `,Vl1028`
);
INSERT INTO `table`     VALUES(
        `yreyryer-12`,
        `990010:20002`,
        `ipv4`,
        `Vl749,Vl1028`
);
INSERT INTO `table`     VALUES(
        `42342342_Core`,
        `990010:1004068`,
        `ipv4`,
        `Vl50,Vl874,Vl894,Vl942,Vl1172,Vl1439,Vl2553`
);
INSERT INTO `table`     VALUES(
        `gdfgdg_Core`,
        `990010:1004498`,
        `ipv4`,
        `Vl617`
);
INSERT INTO `table`     VALUES(
        `Spgdfggdf`,
        `990010:1002798`,
        `ipv4`,
        `Vl779`
);
INSERT INTO `table`     VALUES(
        `gdgdgdgdgCore`,
        `990010:1004278`,
        `ipv4`,
        ``
);
INSERT INTO `table`     VALUES(
        `test`,
        `990010:500500`,
        `ipv4`,
        ``
);
于 2013-02-25T13:34:06.720 に答える