首页 > 解决方案 > 使用 awk 拆分 csv 文件并按列重新格式化保存到新文件

问题描述

我正在尝试学习 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 是否具有类似的功能。

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

问候,乔纳斯

标签: csvawk

解决方案


当您使用 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

推荐阅读