Заменить каждую вторую запятую в текстовом файле - PullRequest
0 голосов
/ 09 мая 2011

Я записал некоторые данные на своем ноутбуке и, поскольку системный язык ОС - немецкий, он преобразовал десятичный разделитель в запятую (в то время я об этом не думал ...).

Разделитель столбцов(в текстовом файле три столбца) тоже запятая, поэтому я получаю шесть столбцов вместо трех

Example.txt

4,0,5,0,6,0

должно быть

4.0, 5.0, 6.0

Как я могу перебрать все файлы в папке и заменить каждую первую, третью и пятую запятую точкой во всех строках моих файлов данных?Я бы предпочел скрипт bash (.sh) или, возможно, решение на Perl

Ответы [ 5 ]

2 голосов
/ 09 мая 2011

Как правило, для разбора CSV вы должны использовать Text::CSV, однако для этой задачи исправления быстрая и грязная может быть:

#!/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

конечно, вы будете читать из файла, а не DATA и, вероятно, печатать в новый файл. Я добавил это реальное использование в качестве комментариев.

2 голосов
/ 09 мая 2011

Или как насчет awk

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

Кстати, вам нужно "moreutils" для губки.И сначала сделайте резервную копию ваших файлов!

1 голос
/ 09 мая 2011

Ну, я вижу много правильных и хороших ответов здесь, вот еще один.

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

Здесь /e означает «выполнить замену детали»; $i^=1 генерирует последовательность 1,0,1,0 ..., а x?y:z выбирает y или z на основе значения x (т.е. if (x) {y} else {z})

0 голосов
/ 09 мая 2011

В Perl необходимое регулярное выражение будет s/,([^,]*,?)/.$1/g. Если вы примените это к строке, она заменит первую запятую точкой, сохранит следующую запятую (если есть) и затем снова начнет искать запятые после второй.

0 голосов
/ 09 мая 2011

Следующий скрипт на Perl должен вам помочь.

 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...