【问题标题】:split csv file with awk and save to new files by column reformat使用 awk 拆分 csv 文件并按列重新格式化保存到新文件
【发布时间】:2020-07-19 02:33:48
【问题描述】:

我正在努力学习 AWK 我有一个大的 csv 文件,我们从一个系统导出并需要导入另一个系统。

CSV 文件是产品列表:

"Varenr.";"Beskrivelse";"Lagerbeholdning";"M�rke Navn";"Forventet levering";"Varegrp. Nr.";"Varegrp. Navn";"Beskrivelse 2";"Beskrivelse 3";"EAN/UPC";"Bruttov�gt";"Nettov�gt"
"0-761345-00101-4";"Power Apt 90W, 19V /";"0";"Antec";"10-04-2020";"600090";"Tilbeh�r, b�rbare";"0-4.74A";"";"885909627561";"2,00";"0,50"
"0-761345-01142-6";"Gamer GX909 Window Midi Tower";"0";"Antec";"10-04-2020";"998000";"Feeds";"military";"";"5706998724038";"7,82";"7,04"
"0-761345-05552-9";"NeoECO 550C (550W) 80+ Bronze";"0";"Antec";"10-04-2020";"205022";"500-799W";"";"";"5706998878328";"2,00";"1,80"
"0-761345-05652-6";"NeoECO 650C (650W) 80+ Bronze";"0";"Antec";"10-04-2020";"998000";"Feeds";"";"";"";"2,26";"2,03"
"0-761345-06248-0";"1000W ATX 13,5cm High Curent P";"0";"Antec";"10-04-2020";"205023";"800-1000W";"";"";"5711783480815";"2,00";"0,50"
"0-761345-06260-2";"HCP 1300 PLATINUM-EC";"0";"Antec";"10-04-2020";"205023";"800-1000W";"";"";"7613450626022";"2,00";"1,60"
"0-761345-06484-2";"power supply unit 400w";"0";"Antec";"10-04-2020";"460565";"Power Supplies";"ATX Black";"15";"761345064842";"1,73";"1,56"
"0-761345-92025-4";"VSK-3000B-U3/U2 Mini Tower";"0";"Antec";"10-04-2020";"210120";"Minitower";"USB3 Blk";"";"761345920254";"3,73";"3,36"
"0-761345-92033-9";"VSK-3000E-U3 Mini Tower US B3";"0";"Antec";"11-05-2020";"210120";"Minitower";"Black";"";"761345920339";"6,00";"6,00"
"0-761345-92043-8";"VSK-4000E-U3 Mini Tower US";"0";"Antec";"11-05-2020";"210120";"Minitower";"B3 Black retail";"";"761345920438";"5,00";"4,00"
"0-761345-93100-7";"NSK-3100-EC Micro Tower Black";"0";"Antec";"10-04-2020";"210140";"Micro ATX";"";"";"761345931007";"4,00";"3,00"
"0-761345-93534-0";"ASK-3000B-U3 Mini Tower 2xUSB";"0";"Antec";"11-05-2020";"998000";"Feeds";"3.0 Blk";"30";"";"3,65";"3,29"

文件包含数千行,我需要根据第 7 列中的类别将文件拆分为单独的文件

到目前为止,我已经能够构建它并且它有效:

awk -F ';' 'NR==1{h=$0; next};!seen[$7]++{f=$7".csv"; print h > f};{f=$7".csv"; print >> f; close(f)}' input.csv

但这给我的文件名带来了问题。因此,在设置 f 变量之前,我需要格式化文本以删除 " 并用 _

替换空格 / 和

我试图弄清楚如何使用 sed 执行此操作,但我不知道如何将其插入 awk 或 awk 是否具有类似功能。

有人知道如何做到这一点吗? 拜托,我不只是想要一个解决方案。我想了解它:-)

问候, 乔纳斯

【问题讨论】:

    标签: csv awk


    【解决方案1】:

    当您使用 awk 时,您不需要与 sed 往来的管道,而且您绝对不会从 awk 调用 sed。 to format the text to remove " and replace spaces, / and , with _ 来自一个包含 $7 值的变量是:

    var=$7
    gsub(/"/,"",var)
    gsub(/[[:space:]/,]/,"_",var)
    

    尝试对现有代码进行这种未经测试的调整:

    awk -F ';' '
        NR==1 {h=$0; next}
        { f=$7".csv"; gsub(/"/,"",f); gsub(/[[:space:]/,]/,"_",f) }
        !seen[f]++ { print h > f }
        { print >> f; close(f) }
    ' input.csv
    

    【讨论】:

    • 感谢您的帮助如果我做对了。例如,如果我还想替换 backslas,我只需在 gosub 中的逗号之后添加 \\ 之前的 ]
    • 正确,您需要按照您的建议转义反斜杠,实际上您不需要像我在括号表达式中所做的那样转义 / 所以我现在从 @987654325 更新它@ 到 /.
    猜你喜欢
    • 1970-01-01
    • 2013-03-04
    • 2015-11-09
    • 1970-01-01
    • 1970-01-01
    • 2020-10-28
    • 2010-10-31
    • 2016-10-04
    • 1970-01-01
    相关资源
    最近更新 更多