Perl 第三列的反向文本
我已将SQL数据导出为制表符分隔或逗号分隔格式的文本Perl 第三列的反向文本,perl,sed,awk,grep,Perl,Sed,Awk,Grep,我已将SQL数据导出为制表符分隔或逗号分隔格式的文本 2 AX Mariehamn Mariehamn ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ma 4 DZ Adrar Adrar ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ad 6
2 AX Mariehamn Mariehamn ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ma
4 DZ Adrar Adrar ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ad
6 DZ Ain Defla Ain Defla ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ai
8 DZ Ain Temchent Ain Temchent ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ai
10 DZ Shantanu Shantanu ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Al
2,"AX","Mariehamn","Mariehamn","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ma"
4,"DZ","Adrar","Adrar","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ad"
6,"DZ","Ain Defla","Ain Defla","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ai"
8,"DZ","Ain Temchent","Ain Temchent","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ai"
10,"DZ","Shantanu","Shantanu","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Al"
我需要反转第三列中的文本,如下所示,同时保持其他列不变
nmaheiraM
rardA
alfeD niA
tnehcmeT niA
unatnahS
可以使用上述任何一种(制表符或CSV)格式 我可以建议
perl -pe "@_=split ',',$_;$_[2]=scalar reverse $_[2];$_=join ',',@_;" <1.csv >2.csv
perl-pe“@u=split',”,$;$[2]=标量反向$[2];$=join',”,@;“2.csv
它也可能与awk有关,但我从未使用过它
更新:抱歉,它在cmd中工作,我没有检查bash。
对于bash,它应该如下所示:
perl -aF/,/ -pe "\$F[2]=scalar reverse \$F[2];\$_=join ',',@F;" <1.csv
我可以建议
perl -pe "@_=split ',',$_;$_[2]=scalar reverse $_[2];$_=join ',',@_;" <1.csv >2.csv
perl-pe“@u=split',”,$;$[2]=标量反向$[2];$=join',”,@;“2.csv
它也可能与awk有关,但我从未使用过它
更新:抱歉,它在cmd中工作,我没有检查bash。
对于bash,它应该如下所示:
perl -aF/,/ -pe "\$F[2]=scalar reverse \$F[2];\$_=join ',',@F;" <1.csv
perl-aF/,/-pe“\$F[2]=scalar reverse\$F[2];\$\$u=join',”,@F;“请参见-逗号分隔值操纵器
use strict;
use warnings;
use Text::CSV;
use Data::Dumper;
my @mydata;
my $csv = Text::CSV->new ( { binary => 1 } ) # should set binary attribute.
or die "Cannot use CSV: ".Text::CSV->error_diag ();
open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!";
while ( my $row = $csv->getline( $fh ) ) {
my $data = reverse($row->[2]);
push(@mydata, $data);
}
print Dumper(\@mydata);
$csv->eof or $csv->error_diag();
close $fh;
请参见-逗号分隔值操纵器,如
use strict;
use warnings;
use Text::CSV;
use Data::Dumper;
my @mydata;
my $csv = Text::CSV->new ( { binary => 1 } ) # should set binary attribute.
or die "Cannot use CSV: ".Text::CSV->error_diag ();
open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!";
while ( my $row = $csv->getline( $fh ) ) {
my $data = reverse($row->[2]);
push(@mydata, $data);
}
print Dumper(\@mydata);
$csv->eof or $csv->error_diag();
close $fh;
你可以用awk。对于CSV
$ awk -F"," '{for(i=length($3);i>=1;i--){s=s substr($3,i,1)};$3=s;s=""}1' OFS="," file
2,"AX","nmaheiraM","Mariehamn","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ma"
4,"DZ","rardA","Adrar","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ad"
6,"DZ","alfeD niA","Ain Defla","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ai"
8,"DZ","tnehcmeT niA","Ain Temchent","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ai"
10,"DZ","unatnahS","Shantanu","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Al"
或者如果你有Ruby(1.9+)
更新:如果你想保存文件,在awk中只需重定向到一个临时文件
乙二醇
顺便说一下,在sed中,保存文件“inplace”的-i选项可以使用awk。对于CSV
$ awk -F"," '{for(i=length($3);i>=1;i--){s=s substr($3,i,1)};$3=s;s=""}1' OFS="," file
2,"AX","nmaheiraM","Mariehamn","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ma"
4,"DZ","rardA","Adrar","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ad"
6,"DZ","alfeD niA","Ain Defla","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ai"
8,"DZ","tnehcmeT niA","Ain Temchent","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ai"
10,"DZ","unatnahS","Shantanu","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Al"
或者如果你有Ruby(1.9+)
更新:如果你想保存文件,在awk中只需重定向到一个临时文件
乙二醇
顺便说一下,在sed
中,要保存文件“inplace”要使用逗号或制表分隔符处理文件,您可以尝试:
#!/usr/bin/perl
use Modern::Perl;
use Data::Dumper;
my @rows;
while(<DATA>) {
chomp;
my ($delim) = $_ =~ /(,|\t)/;
my @fields = split/,|\t/;
$fields[2] = reverse $fields[2];
push @rows, join $delim, @fields;
}
say Dumper \@rows;
__DATA__
2 AX Mariehamn Mariehamn ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ma
4 DZ Adrar Adrar ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ad
6 DZ Ain Defla Ain Defla ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ai
8 DZ Ain Temchent Ain Temchen ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ai
10 DZ Shantanu Shantanu ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Al
2,"AX","Mariehamn","Mariehamn","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ma"
4,"DZ","Adrar","Adrar","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ad"
6,"DZ","Ain Defla","Ain Defla","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ai"
8,"DZ","Ain Temchent","Ain Temchent","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ai"
10,"DZ","Shantanu","Shantanu","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Al"
要使用逗号或表格分隔符处理文件,可以尝试:
#!/usr/bin/perl
use Modern::Perl;
use Data::Dumper;
my @rows;
while(<DATA>) {
chomp;
my ($delim) = $_ =~ /(,|\t)/;
my @fields = split/,|\t/;
$fields[2] = reverse $fields[2];
push @rows, join $delim, @fields;
}
say Dumper \@rows;
__DATA__
2 AX Mariehamn Mariehamn ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ma
4 DZ Adrar Adrar ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ad
6 DZ Ain Defla Ain Defla ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ai
8 DZ Ain Temchent Ain Temchen ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Ai
10 DZ Shantanu Shantanu ACTIVE 2011-03-15 17:23:12 2011-03-15 17:23:12 SYSTEM Al-Al
2,"AX","Mariehamn","Mariehamn","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ma"
4,"DZ","Adrar","Adrar","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ad"
6,"DZ","Ain Defla","Ain Defla","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ai"
8,"DZ","Ain Temchent","Ain Temchent","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Ai"
10,"DZ","Shantanu","Shantanu","ACTIVE","2011-03-15 17:23:12","2011-03-15 17:23:12","SYSTEM","Al-Al"
#在-e行1,靠近“txt[”###执行-e由于编译错误而中止。使用perl的-a
和-F
选项为您执行拆分(进入数组@F
)--不需要在-e行1,靠近“txt[”的位置用#语法错误重定向输入###由于编译错误,-e的执行被中止。使用perl的-a
和-F
选项为您执行拆分(到数组@F
)--无需重定向输入,谢谢。#在sed中,我可以使用-e替换文件。在awk中是否可能出现类似的情况?或者我必须保存>到.file,然后将文件移回?perl-I.bak-F,-lape'$F[2]=反向$F[2];$\ux=join“,”“,@F”file
@ikegami,请将您的Perl解决方案作为您自己的答案发布。谢谢。#在sed中,我可以使用-e替换该文件。在awk中是否可能出现类似的情况?或者我必须将>保存到.file,然后将该文件移回?Perl-I.bak-F,-lape'$F[2]=reverse$F[2];$\uu=join”,@F'文件
@ikegami,请将您的Perl解决方案作为您自己的答案发布。