【问题标题】:Add index column to CSV file将索引列添加到 CSV 文件
【发布时间】:2015-08-12 08:51:24
【问题描述】:

我有一个大的逗号分隔文件 (6GB),并想向其中添加一个索引列。我正在寻找 Unix 类型的解决方案以提高效率。我使用的是 Mac。

我有这个:

V1  V2  V3
0.4625  0.9179  0.8384
0.9324  0.2486  0.1114 
0.6691  0.7813  0.6705
0.1935  0.3303  0.4336

想要得到这个:

ID  V1  V2  V3
1   0.4625  0.9179  0.8384
2   0.9324  0.2486  0.1114
3   0.6691  0.7813  0.6705
4   0.1935  0.3303  0.4336

【问题讨论】:

  • 格式是固定宽度还是制表符分隔?
  • 一些平台信息在这里会很有用。到目前为止的答案都假设是一个类 Unix 平台。但也许 OP 在 Windows 上。你有什么特别的工具吗?
  • @Tom Fenech - 逗号分隔
  • @LondonRob - 我使用的是 Mac。我把这个问题含糊其辞,因为我对 Unix 知之甚少。
  • @SharkSandwich,如果它是逗号分隔,那么你应该在你的问题中表明这一点。

标签: bash csv


【解决方案1】:

这可能会起作用:

awk -F'\t' -v OFS='\t' '
  NR == 1 {print "ID", $0; next}
  {print (NR-1), $0}
' input.csv > output.csv

awk 中,NR 变量是“到目前为止看到的输入记录的总数”,通常表示“当前行号”。所以第一行的NR == 1是我们匹配第一条记录并添加“ID”列标题的方式,其余行我们使用NR-1作为索引。

-F'\t' 参数设置输入字段分隔符,-vOFS='\t' 设置输出 字段分隔符。

【讨论】:

  • 看起来不错,虽然我个人会删除 -F 作为默认值。
  • 有什么办法让它更快?还是理想情况下使用多核?
  • @AbdulMoiz 我不确定你在说什么。如果您针对示例输入数据运行此脚本,它将准确生成所需的输出。输出是一个完全标准的制表符分隔文件,这是 OP 所要求的。
  • @larsks 对不起,我的错
【解决方案2】:

由于原始帖子中没有指定技术,我很乐意在这里保持简单。

(如果您知道自己在做什么,那么所有花哨的 Vim/bash 解决方案都可以)

  • 在您喜欢的电子表格程序中打开 CSV 文件(我正在使用 LibreOffice,但 Excel 或本机 Mac 等效程序都可以)
  • 在 A 列左侧插入一列
  • 在单元格 A2 中输入 1,即标题下的第一个单元格
  • 双击单元格右下角的blob,如屏幕截图所示:

最后一步将用1,2,3... 等填充索引列。 然后,您可以再次将生成的电子表格另存为 CSV 文件。

【讨论】:

  • 感谢您的回复。由于文件的大小,我无法使用电子表格程序。它大约为 6GB。这就是我寻找 Unix 类型解决方案的原因。
  • 您为什么不将您在各种 cmet 中添加到各种答案的所有详细信息添加到原始帖子中?它将节省更多人试图猜测您的情况。
【解决方案3】:

我假设你有一个逗号分隔的文件。

使用 vim 打开文件。在普通模式下,键入

:%s/^/\=line('.').','/

:%s/^/\=line('.')/ 在行首添加行号。由于您有一个逗号分隔的文件(添加一列),因此您需要在行号之后使用逗号。所以.','

有关:%s/^/\=line('.')/的完整说明,请参阅this answer

【讨论】:

    【解决方案4】:
    1. 在您喜欢的电子表格程序(例如 Excel)中打开 CSV 文件
    2. 在第一列的左侧插入一列
    3. 在此列的第一个单元格中键入 1
    4. 在以下单元格中键入方程式“=A2+1

    1. 双击单元格右下角的blob,如屏幕截图所示

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 2015-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多