我在笔记本电脑上记录了一些数据,因为操作系统语言是德语,它将小数点分隔符转换为逗号(当时没想到......)。
列分隔符(文本文件中有三列)也是逗号,因此我最终得到六列而不是三列
example.txt中
4,0,5,0,6,0
应该是
4.0, 5.0, 6.0
如何循环浏览文件夹中的所有文件并将每个第一,第三和第五个逗号替换为数据文件中所有行中的一个点?我更喜欢bash脚本(.sh)或可能是perl解决方案
答案 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
。如果将此应用于字符串,它将用句点替换第一个逗号,保留下一个逗号(如果有),然后在第二个逗号后再次开始查找逗号。