使用shell脚本从另一个CSV中的特定列创建CSV

时间:2015-01-24 19:39:06

标签: bash shell csv

我有一个包含数千行的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列中,我想使用&#34; column6,column6,collumn1&#34;

构建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号,但它总是空着。

1 个答案:

答案 0 :(得分:2)

该代码片段对我来说看起来很好用,也许你在文件中有一些奇怪的字符,或者它来自DOS环境(使用dos2unix来&#34;清理&#34;它!)。此外,您可以使用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打印。在这里,用逗号。