【问题标题】:Create CSV from specific columns in another CSV using shell scripting使用 shell 脚本从另一个 CSV 中的特定列创建 CSV
【发布时间】:2015-01-24 19:39:05
【问题描述】:

我有一个包含数千行的 CSV 文件,我需要获取该文件中的一些列来创建另一个用于导入数据库的 CSV 文件。

我不再熟悉 shell 脚本了,有没有人可以帮助我指出正确的方向?

我有一个 bash 脚本来读取源文件,但是当我尝试将我想要的列打印到一个新文件时它不起作用。

while IFS=, read symbol tr_ven tr_date sec_type sec_name name
do
    echo "$name,$name,$symbol" >> output.csv
done < test.csv

上面是我的代码。在原始文件的 6 列中,我想用“column6,column6,column1”构建一个 CSV

测试的CSV文件是这样的:

Symbol,Trading Venue,Trading Date,Security Type,Security Name,Company Name
AAAIF,Grey Market,22/01/2015,Fund,,Alternative Investment Trust
AAALF,Grey Market,22/01/2015,Ordinary Shares,,Aareal Bank AG
AAARF,Grey Market,22/01/2015,Ordinary Shares,,Aluar Aluminio Argentino S.A.I.C.

我的脚本做错了什么?或者,有没有更简单、更快捷的方法?

编辑

这些是真正的标题:

Symbol,US Trading Venue,Trading Date,OTC Tier,Caveat Emptor,Security Type,Security Class,Security Name,REG_SHO,Rule_3210,Country of Domicile,Company Name

我正在尝试获取最后一列,即第 12 列,但它始终为空。

【问题讨论】:

  • sn-p 对我来说看起来不错。我什至对其进行了测试并按预期工作。不过,您可以考虑使用这个 awk,更直接一点:awk 'BEGIN{FS=OFS=","} {print $6,$6,$1}' test.csv &gt; output.csv
  • 你知道吗,我也用 AWK 找到了一个解决方案并尝试了它,但没有奏效......但我刚刚尝试了你的解决方案,它成功了!我发现的另一个 AWK 解决方案是这样的(仅使用不同的列):awk -F, '{getline f1 &lt;"test.csv" ;print f1,$3,$4}' OFS=, output.csv
  • 愿意写下您的解决方案作为接受它的答案吗?
  • 当然!这个getline 用法是完全没有必要的,所以扔掉那个sn-p :)

标签: bash shell csv


【解决方案1】:

sn-p 对我来说看起来和工作都很好,也许你的文件中有一些奇怪的字符或者它来自 DOS 环境(使用dos2unix 来“清理”它!)。此外,您可以使用read -r 来防止带有反斜杠的奇怪行为。

但让我们看看awk 如何更快地解决这个问题:

awk 'BEGIN{FS=OFS=","} {print $6,$6,$1}' test.csv >> output.csv

说明

  • BEGIN{FS=OFS=","} 这将输入和输出字段分隔符设置为逗号。或者,您可以说-F=","-F, 或使用-v FS="," 将其作为变量传递。这同样适用于OFS
  • {print $6,$6,$1} 打印第 6 个字段两次,然后打印第一个字段。请注意,使用print,您提供的每个以逗号分隔的参数都将使用先前设置的OFS 打印。在这里,用逗号。

【讨论】:

  • 好的,我使用上面的 CSV 示例进行了简化,并且使用您所说的命令确实可以工作,但是当我将其修改为真实文件时,它不会..这些是我的标题:
  • 我更新了问题,使用正确的标题和最后一列总是空的问题......知道我做错了什么吗?这是我最后的 awk 命令: awk 'BEGIN{FS=OFS=","} {print $12,$6,$1}' test.csv > output.csv
  • 从输入很难说。但是如果要打印最后一个字段,可以在awk中使用{print $NF}。由于NF 指的是字段数,$NF 包含最后一个字段。因此,例如,编写以下内容并检查文件是否真的包含 12 个字段:awk '{print NF}' 并期望 12。否则,检查第 12 个字段是什么awk '{print $NF}'。当然,总是使用BEGIN{}
  • 好的,是换行符起作用了...我无法在我的 Mac 上使用 dos2unix,我运行了 cat test.csv | col -b > x.csv 然后你的 awk 运行得很好!
  • 感谢 fedorqui,我将保存这个 awk 命令以供将来参考:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多