替换文本文件中的每秒逗号

时间:2011-05-09 14:31:11

标签: perl shell batch-file

我在笔记本电脑上记录了一些数据,因为操作系统语言是德语,它将小数点分隔符转换为逗号(当时没想到......)。

列分隔符(文本文件中有三列)也是逗号,因此我最终得到六列而不是三列

example.txt中

4,0,5,0,6,0

应该是

4.0, 5.0, 6.0

如何循环浏览文件夹中的所有文件并将每个第一,第三和第五个逗号替换为数据文件中所有行中的一个点?我更喜欢bash脚本(.sh)或可能是perl解决方案

5 个答案:

答案 0 :(得分:2)

或者awk怎么样

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

顺便说一句,你需要“moreutils”作为海绵。并先备份你的文件!

答案 1 :(得分:2)

通常对于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 :(得分:1)

我在这里看到了很多有效和好的答案,这是另一个。

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

此处/e表示“执行替换部分”; $i^=1生成1,0,1,0 ...序列,x?y:z根据x的值选择y或z(即if (x) {y} else {z}

答案 3 :(得分:0)

遵循perl脚本应该可以帮到你。

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

输出

4.0,5.0,6.0

答案 4 :(得分:0)

在Perl中,必要的正则表达式为s/,([^,]*,?)/.$1/g。如果将此应用于字符串,它将用句点替换第一个逗号,保留下一个逗号(如果有),然后在第二个逗号后再次开始查找逗号。