2015-06-17 2 views
3

У меня есть CSV-файл, который может выглядеть следующим образом:Как разбить файл 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 

Есть ли простой способ сделать это с баш?

ответ

9

Вы можете использовать AWK для создания файла, содержащего только конкретное значение второго столбца:

awk -F ';' '($2==1){print}' data.dat > data1.dat 

Просто измените значение в состоянии $2==.

Или, если вы хотите сделать это автоматически, просто используйте:

awk -F ';' '{print > ("data"$2".dat")}' data.dat 

, который будет выводить на файлы, содержащие значение второго столбца в имени.

+0

можно ли печатать округленные значения вместо (например, 260 вместо 260.483)? – user3616643

+0

Вы можете обрезать значения, используя функцию int(), 'awk -F ';' '{print> "data" int ($ 2) ".dat"}' data.dat' –

+1

и, конечно, вы можете печатать только выбранные столбцы (и усекать их), например. используя 'print int ($ 3)> ....' –

1

Попробуйте это:

while IFS=";" read -r a b c; do echo "$a;$b;$c" >> data${b}.dat; done <file 
Смежные вопросы