Bash 如何根据列值将CSV文件拆分为多个文件

Bash 如何根据列值将CSV文件拆分为多个文件,bash,csv,awk,Bash,Csv,Awk,我有一个CSV文件,看起来像这样: name1;1;11880 name2;1;260.483 name3;1;3355.82 name4;1;4179.48 name1;2;10740.4 name2;2;1868.69 name3;2;341.375 name4;2;4783.9 可能有更多或更少的行,我需要将其拆分为多个.dat文件,每个文件都包含与此文件第二列值相同的行。(然后我将为每个.dat文件制作条形图)对于这种情况,它应该是两个文件: data1.dat name1;1;11

我有一个CSV文件,看起来像这样:

name1;1;11880
name2;1;260.483
name3;1;3355.82
name4;1;4179.48
name1;2;10740.4
name2;2;1868.69
name3;2;341.375
name4;2;4783.9
可能有更多或更少的行,我需要将其拆分为多个.dat文件,每个文件都包含与此文件第二列值相同的行。(然后我将为每个.dat文件制作条形图)对于这种情况,它应该是两个文件:

data1.dat 
name1;1;11880
name2;1;260.483
name3;1;3355.82
name4;1;4179.48

data2.dat
name1;2;10740.4
name2;2;1868.69
name3;2;341.375
name4;2;4783.9

使用bash有什么简单的方法吗

您可以使用awk生成仅包含第二列特定值的文件:

awk -F ';' '($2==1){print}' data.dat > data1.dat
只需更改
$2==
条件中的值

或者,如果要自动执行此操作,只需使用:

awk -F ';' '{print > ("data"$2".dat")}' data.dat
将输出到包含名称中第二列值的文件。

尝试以下操作:

while IFS=";" read -r a b c; do echo "$a;$b;$c" >> data${b}.dat; done <file

而IFS=“;”读取-r a b c;执行echo“$a;$b;$c”>>数据${b}.dat;完成是否可以打印舍入值而不是(例如,260而不是260.483)?您可以使用int()函数,
awk-F';''截断值{print>“data”int($2)”.dat“}”data.dat
当然,您可以只打印选定的列(并截断它们),例如,使用
print int($3)>…
我使用第二种形式得到语法错误,我需要这样写:
awk-F',“{print>($2.csv”)}“
-注意额外的偏执。有没有关于如何对多个字段进行组合的提示?假设我想在第二列和第三列执行相同的操作,而不仅仅是第二列?@khan:我建议这样做。