Bash 如何根据列值将CSV文件拆分为多个文件
我有一个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
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:我建议这样做。