问题描述:

I recorded some data on my laptop and because the OS system language is German it converted the decimal separator to a comma (didn't think of that at the time...).

The column separator (there are three columns in the text file) is a comma too and so I end up with six columns instead of three

Example.txt

4,0,5,0,6,0

should be

4.0, 5.0, 6.0

How can I loop through all files in a folder and replace every first, third and fifth comma with a point in all lines in my data-files? I would prefer a bash script (.sh) or possibly a perl solution

网友答案:

Or how about awk

for F in * ; do awk -F,  'BEGIN { OFS = "," } ; { print $1"."$2, $3"."$4, $5"."$6 } ' $F | sponge $F ; done

You need "moreutils" for sponge, by the way. And back up your files first!

网友答案:

Generally for csv parsing you should use Text::CSV, however for this correction task, a quick and dirty could be:

#!/usr/bin/perl

use strict;
use warnings;

my $output;
#onen my $out, '>', 'outfile.dat'; 
#open my $in, '<', 'infile.dat';
#while(<$in>){
while(<DATA>){
  chomp;

  my @fields = split ',';
  while (@fields) {
    $output .= shift(@fields) . '.' . shift(@fields);
    $output .= ', ' if @fields;
  }

  $output .= "\n";

}

#print $out $output;
print $output;

__DATA__
4,0,5,0,6,0
4,0,5,0,6,0

of course you will read from a file rather than DATA and print to a new file presumably. I have added this real-world usage as comments.

网友答案:

Well I see lots of valid and good answers here, here's another.

perl -wpe 'my $i; s/,/($i^=1) ? "." : ","/ge'

Here /e means "execute the replacement part"; $i^=1 generates a 1,0,1,0...sequence, and x?y:z selects y or z based on x's value (i.e. if (x) {y} else {z})

网友答案:

Following perl script should help you.

 perl -e '$a = $ARGV[0]; $a =~ s/(\d)\,(\d\,)?/$1\.$2/g; print $a' "4,0,5,0,6,0"

OUTPUT

4.0,5.0,6.0
网友答案:

In Perl, the necessary regex would be s/,([^,]*,?)/.$1/g. If you apply this to a string, it will replace the first comma with a period, preserve the next comma (if any), and then start looking for commas again after the second one.

相关阅读:
Top