perl中的tr命令来更改列值

  • 本文关键字:中的 tr 命令 perl perl
  • 更新时间 :
  • 英文 :


My.txt文件如下(请考虑它是1GB文件(:

hello,12,abcd,xyz
welcome,13,abcd,yul
hai,14,abcd,ghk

现在,我想加密第一列和第三列,如下所示

zzyyy,12,zzzz,xyz
asdsddd,13,zzzz,yul
asd,14,zzzz,ghk

我有加密密钥,如下面的

export key=ETAOINSHRDLUBCFGJMQPVWZYXK

现在,我需要在perl脚本中应用这个密钥来加密文件中的第一列和第三列:

export key=ETAOINSHRDLUBCFGJMQPVWZYXK
perl -F, -lane '$F[$_] =~ tr/a-z/A-Z/ =~ tr/A-Z/"$key"/ for (0, 2); print join(",", @F)' file.txt

所以,当在上面的脚本中运行时,键没有被应用,第二个tr命令也不起作用。所以,你能帮我找出剧本中的错误吗。

我只需要像下面这样在上面的Perl脚本中应用

tr "a-z" "A-Z" | tr "A-Z" "$key"

我在tr///:的文档中看到了这一点

从来没有任何变量插值,所以"以及"@"总是被视为文字。

因此,试图通过环境传递密钥是行不通的。但是您可以这样做,将shell变量插入到perl代码中:

perl -F, -lane '
sub encode { my $str = uc shift; $str =~ tr/A-Z/'"$key"'/r; }
# ..............................................^^....^^
$F[$_] = encode($F[$_]) for (0, 2);
print join(",", @F)
' file.txt

输出:

HIUUF,12,ETAO,xyz
ZIUAFBI,13,ETAO,yul
HER,14,ETAO,ghk

或者,使用eval

perl -F, -lane '
sub encode { my $str = uc shift; eval "$str =~ tr/A-Z/$ENV{key}/r" }
$F[$_] = encode($F[$_]) for (0, 2);
print join(",", @F)
' file.txt

最新更新