使用Mac终端在CSV特定列的N位置添加字符

时间:2018-11-25 22:32:47

标签: macos sed terminal

我的csv具有选举结果

/* Match, but no default */
SELECT TOP 1 id, lang
FROM (
  SELECT id, lang 
  FROM t3
  WHERE id = 3

  UNION ALL 

  SELECT id, lang
  FROM t3 
  WHERE id IN (1,2) /* DEFAULT IDs */
) s1
ORDER BY id DESC
;

聚会名称后面的第二列是投票百分比(01546 ... 02315 ...)。
是否可以使用Mac终端在特定列的第3和4rt字符之间添加点(。),以产生以下输出:

/* Default 1 and 2 are not ID 2 and 1. */
CREATE TABLE t4 ( id int, lang varchar(10) ) ;
INSERT INTO t4 (id, lang)
VALUES (40,'Default 2'),(42,'Default 1'),(3,'Klingon')
  ,(50, 'Common'),(20, 'Nadsat'),(55, 'Furbish')
;

/* No match. Pick Default. */
SELECT TOP 1 s1.id, s1.lang
FROM (
  SELECT id, lang 
  FROM t4
  WHERE id = 9999

  UNION ALL 

  SELECT s2.id, s2.lang 
  FROM (
    SELECT TOP 1 id, lang
      , CASE 
          WHEN ID = 42 THEN 2 
          WHEN ID = 40 THEN 1 
          ELSE 0 
        END AS sortOrder
    FROM t4 
    WHERE id IN (40,42) /* NEW DEFAULT IDs */
    ORDER BY sortOrder DESC
  ) s2
) s1
ORDER BY s1.id DESC
;

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

我在当地一家报纸上从事印刷版画工作。我没有太多的编码经验。只是一些基本的HTML和JS。

我们将从选举当局那里收到几份CSV(每个省一个)。

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

我是终端命令的新手。我在这里发现了一些非常有用的命令(cat可从一个区域的多个区域连接csv,并剪切以提取我需要的列),但与插入字符无关(除非它们位于行首)

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

1 个答案:

答案 0 :(得分:2)

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,