我有这样的档案:
AA,A=14,B=356,C=845,D=4516
BB,A=65,C=255,D=841,E=5133,F=1428
CC,A=88,B=54,C=549,F=225我从来不知道在行中是否遗漏了A,B,C或D值。但我需要转换这个文件如下:
AA,A=14,B=356,C=845,D=4516,-,-
BB,A=65,-,C=255,D=841,E=5133,F=1428
CC,A=88,B=54,C=549,-,-,F=225因此,如果有任何值丢失,只需打印-标记。我的计划是拥有相同数量的列以便于解析。我更喜欢awk解决方案。谢谢你的建议或帮助。
我的第一次尝试是:
awk '{gsub(/[,]/, "\t")}; BEGIN{ FS = OFS = "\t" } { for(i=1; i<=NF; i++) if($i ~ /^ *$/) $i = "-" }; {print $0}'但我注意到,有些价值观缺失了。
编辑:
从我的头上我知道有值A,B,C,D,E,F.
发布于 2016-09-05 15:15:50
Perl来救我!
您还没有指定如何获取标头信息,因此在下面的脚本中,@header数组将直接填充。
%to_idx散列将列名映射到它们的索引(A => 0、B => 1等)。
每一行被分割成字段,每个字段与预期的字段($next)进行比较,并在需要时打印破折号。对于缺失的拖尾字段,情况也是如此。
#!/usr/bin/perl
use warnings;
use strict;
my @header = qw( A B C D E F );
my %to_idx = map +($header[$_] => $_), 0 .. $#header;
open my $IN, '<', shift or die $!;
while (<$IN>) {
chomp;
my @fields = split /,/;
print shift @fields;
my $next = 0;
for my $field (@fields) {
my ($name, $value) = split /=/, $field;
print ',-' x ($to_idx{$name} - $next);
print ",$name=$value";
$next = $to_idx{$name} + 1;
}
print ',-' x (1 + $#header - $next); # Missing trailing fields.
print "\n"
}https://stackoverflow.com/questions/39331907
复制相似问题