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

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 &

我有一个包含数千行的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
我的脚本有什么问题?或者,有没有一种更简单、更快的方法

编辑 以下是真正的标题:

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,
    ,或者使用
    -vfs=“,”
    将其作为变量传递。这同样适用于OFS
  • {print$6,$6,$1}
    打印第六个字段两次,然后打印第一个字段。请注意,使用
    print
    ,您给出的每个逗号分隔参数都将使用先前设置的
    OFS
    打印。这里,用逗号

我觉得这个片段不错。我甚至测试了它,并按预期工作。你可以考虑使用这个AWK,但是,更直接一点:<代码> AWK“开始{FS=OFS=”,“{打印6美元,6美元,1美元}”Test.CSV>输出。CSV < /代码>你知道吗,我也发现了一个用AWK的解决方案并尝试了,没有工作…但我刚试过你的,果然成功了!我发现的另一个AWK解决方案是这样的(只是有不同的列):
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