Perl 第三列的反向文本

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

我已将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       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解决方案作为您自己的答案发布。