Bash 使用shell脚本从另一个CSV中的特定列创建CSV
我有一个包含数千行的CSV文件,我需要获取该文件中的一些列,以创建另一个CSV文件,用于导入到数据库 我对shell脚本已经不熟悉了,有没有人能帮我指出正确的方向 我有一个bash脚本来读取源文件,但当我试图打印列时,我想打印一个新文件,但它就是不起作用Bash 使用shell脚本从另一个CSV中的特定列创建CSV,bash,shell,csv,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 &
while IFS=, read symbol tr_ven tr_date sec_type sec_name name
do
echo "$name,$name,$symbol" >> output.csv
done < test.csv
我的脚本有什么问题?或者,有没有一种更简单、更快的方法
编辑
以下是真正的标题:
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列,但它总是空的。我觉得这个代码段看起来很好,工作正常,可能文件中有一些奇怪的字符,或者它来自DOS环境(使用
dos2unix
来“清理”它!)。此外,您还可以使用read-r
来防止出现带有反斜杠的奇怪行为
但是让我们看看awk
如何更快地解决这个问题:
awk 'BEGIN{FS=OFS=","} {print $6,$6,$1}' test.csv >> output.csv
解释
将输入和输出字段分隔符设置为逗号。或者,您可以说BEGIN{FS=OFS=“,”}
,-F=“,”
,或者使用-F,
将其作为变量传递。这同样适用于OFS-vfs=“,”
打印第六个字段两次,然后打印第一个字段。请注意,使用{print$6,$6,$1}
,您给出的每个逗号分隔参数都将使用先前设置的print
打印。这里,用逗号OFS
AWK-F,'{getline f1是否愿意编写您的解决方案作为接受它的答案?当然!这个getline
用法是非常不必要的,所以扔掉这个片段:)好的,我使用了上面的CSV示例来简化,它确实可以使用您所说的命令,但是当我将它修改为实际文件时,它不能…。这些是我的标题:我用正确的标题和最后一列总是空的问题…知道我做错了什么吗?这是我的最后一个awk命令:awk'BEGIN{FS=OFS=“,”}{print$12,$6,$1}'test.csv>output.csvIt很难从输入中说出。但是如果你想打印最后一个字段,你可以使用{print$NF}
在awk中。由于NF
指的是字段的数量,$NF
包含最后一个字段。因此,例如,请编写以下内容并检查文件是否确实包含12个字段:awk'{print NF}'
和预期的12个字段。否则,请检查第12个字段是什么意思awk'{print$NF}
。始终使用BEGIN}
block,当然,是新行出错了……我无法在mac上使用dos2unix,我运行了cat test.csv | col-b>x.csv,之后您的awk运行得很好!谢谢fedorqui,我将保存此awk命令以备将来参考:)
awk 'BEGIN{FS=OFS=","} {print $6,$6,$1}' test.csv >> output.csv