csv - 使用 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 是否具有类似的功能。
任何人都知道如何做到这一点?拜托,我不只是想要一个解决方案。我想了解它:-)
问候,乔纳斯
解决方案
当您使用 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
推荐阅读
- ruby - 为什么 Ruby 的 IO#pwrite 是线程安全的?
- sql - 选择既是经理又在经理手下工作的员工
- javascript - 如何访问嵌入模板的 DOM 元素?(角度 11)
- html - navbar-brand 标志在折叠时向下移动,我希望它留在左上角
- c - pthreads / C : 使用标志优雅地终止其他线程
- websphere-commerce - SubscriptionSchedulerCmd 在没有注册用户 ID 的情况下无法运行 - HCL Commerce / IBM WCS
- javascript - 为什么我在 React 中的对象显示未定义的对象值?
- html - 如何在 Markdown 中将 2 个链接放入 1 个图像中
- java - 未找到带参数的 Sprint 引导映射
- docker - docker 无法将本地文件添加到容器