Madoc Comadrin
Madoc Comadrin

Reputation: 568

Replace characters in specific columns only (CSV)

I have data like this:

1;2015-04-10;23:10:00;10.4.2015 23:10;8.9;1007.5;0.3;0.0;0;55
2;2015-04-10;23:20:00;10.4.2015 23:20;8.6;1007.8;0.4;0.0;0;56
3;2015-04-10;23:30:00;10.4.2015 23:30;8.5;1008.1;0.4;0.0;0;57

It has dot . as decimal separator but I need to use , instead.

Desired data:

1;2015-04-10;23:10:00;10.4.2015 23:10;8,9;1007,5;0,3;0,0;0;55

I tried using Sed. With sed -i 's/\./,/g' myfile.csv I could replace all dots with commas but would destroy dates on the fourth column. How can I change dots to commas in elsewhere but leave the fourth column as it is? If some other Linux tool is better for this task than Sed I could use it as well.

Upvotes: 0

Views: 6251

Answers (4)

Claes Wikner
Claes Wikner

Reputation: 1517

changes dot to comma in second column

awk '{gsub(/\./,",",$2)}1' file

1;2015-04-10;23:10:00;10.4.2015 23:10;8,9;1007,5;0,3;0,0;0;55
2;2015-04-10;23:20:00;10.4.2015 23:20;8,6;1007,8;0,4;0,0;0;56
3;2015-04-10;23:30:00;10.4.2015 23:30;8,5;1008,1;0,4;0,0;0;57

Upvotes: 0

Adolf Misquith
Adolf Misquith

Reputation: 1

You could go with:

awk 'BEGIN {FS=OFS=";"} {if(NF==5);gsub(/\./,",",$5)} 1 ' filename

Here I have used gsub instead of sub; the difference is that sub will replace only the first occurrence, whereas gsub will replace all occurrences.

Upvotes: 0

choroba
choroba

Reputation: 241868

Perl and Text::CSV:

#! /usr/bin/perl
use warnings;
use strict;

use Text::CSV;

my $csv = 'Text::CSV'->new({ binary      => 1,
                             sep_char    => ';',
                             quote_space => 0,
                           }) or die 'Text::CSV'->error_diag;
open my $FH, '<:encoding(utf8)', 'input.csv' or die $!;
$csv->eol("\n");
while (my $row = $csv->getline($FH)) {
    s/\./,/g for @$row[ 0 .. 2, 4 .. $#$row ];
    $csv->print(*STDOUT, $row);
}

Upvotes: 0

Ed Morton
Ed Morton

Reputation: 203512

sed is for simple substitutions, for anything else just use awk:

$ awk 'BEGIN{FS=OFS=";"} {for (i=5;i<=NF;i++) sub(/\./,",",$i)} 1' file
1;2015-04-10;23:10:00;10.4.2015 23:10;8,9;1007,5;0,3;0,0;0;55
2;2015-04-10;23:20:00;10.4.2015 23:20;8,6;1007,8;0,4;0,0;0;56
3;2015-04-10;23:30:00;10.4.2015 23:30;8,5;1008,1;0,4;0,0;0;57

Upvotes: 5

Related Questions