【问题标题】:Add a character in a N position of a CSV's specific column using mac terminal使用mac终端在CSV特定列的N位置添加一个字符
【发布时间】:2019-04-27 14:25:17
【问题描述】:

我有一个包含选举结果的 csv

PARTY1,00000003,01546,0020,PARTY2,00000001,02315,0022,PARTY3,00000000,00000,0006,

政党名称后的第二列是投票百分比(01546 ... 02315...)。
有没有办法使用 Mac 终端在特定列的第 3 和第 4 个字符之间添加一个点 (.) 以获得此输出:

PARTY1,00000003,015.46,0020,PARTY2,00000001,023.15,0022,PARTY3,00000000,000.00,0006,

所有百分比列将有 5 位数字。该表的前后列更多。

我为一家当地报纸工作,负责印刷版面。我没有太多的编码经验。只是一些基本的 HTML 和 JS。

我们将从选举当局收到多个 csv(每个省一个)。

我知道如何使用电子表格应用(excel、libre office)管理这些数据。但如果可能的话,我想避免它们,因为我看到我通常会执行一些操作(合并、删除列、添加标题)可以通过终端更快、更轻松地完成。

我是终端命令的新手。我在这里和那里找到了一些非常有用的命令(cat 用于将多个区域中的 csv 连接在一起,cut 用于提取我需要的列)但没有关于插入字符(除非它们位于行首)

我的输出数据将作为交互式地图发送到 Datawrapper 或 Carto,并且可能会被 Qgis 与 shp 合并并为报纸生成 pdf。

【问题讨论】:

  • 欢迎来到 SO。 Stack Overflow 是一个专为专业和热情的程序员准备的问答页面。将您自己的代码添加到您的问题中。您应该至少展示自己为解决这个问题所做的研究。
  • 00000 应该转换成什么? 00.000?
  • 我已经添加了我的测试。我知道如何使用电子表格应用程序(excel、libre office)来做到这一点。但如果可能的话,我想避免它们。我是终端命令的新手,我发现了一些非常有用的命令(cat 用于将多个区域的 csv 连接在一起,并 cut 用于提取我需要的列)。最终输出将是一张地图,其工具提示显示类似“party1:15.46% / Party3:0.00% 等”。因此,在我看来,转换只是在 5 个字符的字符串中插入一个字符。
  • 您将要格式化的数据发送到哪里?它是到另一个文件还是直接通过管道传输到应用程序?
  • 请更新您的 Q 以包含您在上述评论中包含的重要信息。 Q 的正确形式是 1. 小样本输入(检查),2. 该样本输入的所需输出(未找到) 3. 您尝试解决问题的代码/错误消息(未找到)。 4. 其他关于问题的想法。(检查(ish))。基本上,您需要人们可以剪切并粘贴到其终端的代码/数据。鉴于您显示的示例数据,*nix 实用程序在行/制表符分隔的数据上工作得更好,而不是 CSV。 (每条记录的行,每个字段之间的选项卡)。 ....

标签: macos sed terminal


【解决方案1】:
awk 'BEGIN{FS=OFS=","} {for(i=3; i<=NF; i=i+4) $i=sprintf("%.2f",$i/100)}1' file

输出:

PARTY1,00000003,15.46,0020,PARTY2,00000001,23.15,0022,PARTY3,00000000,0.00,0006,

更新:

awk 'BEGIN{FS=OFS=","} {for(i=3; i<=NF; i=i+4) $i=substr($i,1,3)"."substr($i,4,2)}1' file

输出:

PARTY1,00000003,015.46,0020,PARTY2,00000001,023.15,0022,PARTY3,00000000,000.00,0006,

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-01
    • 2015-04-30
    • 1970-01-01
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 2016-09-10
    • 2016-06-07
    相关资源
    最近更新 更多