Is there a Perl substitute for the cut and paste shell commands?
I saw once a quick and dirty Perl implementation for the cut and paste linux commands. It was something like
perl 'print "$F1"' filename
to substitute a cut -f1 filename command
Can someone tell me how was this Perl way? Specifically, I'm interested b开发者_运维技巧ecause this, unlike cut/paste, will work the same also in Windows environments.
Do you know about the Perl Power Tools? They are implementations of your favorite unix commands, but done in Perl. If you have Perl, you can have your favorite commands without acrobatics on the command line. PPT has both cut
and paste
.
Although many people pointed you to some perl
switches, they forget to link to perlrun which explains them all.
cut
perl -alpe'$_=$F[0]'
perl -alpe'$_="@F[1..3]"'
To give a custom input separator,
perl -F: -alpe'$_=$F[0]'
To change the output separator,
perl -F: -alpe'$"=":";$_="@F[1..3]"'
To grep
while you're at it,
perl -alne'print$F[0]if/blah/'
paste
Not quite as easy.
#!/usr/bin/perl
for (@ARGV ? @ARGV : qw(-)) {
if ($_ eq '-') {push @files, *STDIN}
else {open $files[@files], '<', $_}
}
while (grep defined, (@lines = map scalar <$_>, @files)) {
chomp @lines;
print join("\t", @lines), "\n";
}
For cut: I think you are looking for the perl -ane
solution (the -e
executes the following code, the -an
applies @F = split (/\t/,$line)
to every line in the file).
So something like:
perl -ane 'print "$F[0]\t$F[1]\n"' file
which is identical to:
cut -f1,2 file
For paste, I'm not sure how you can do this, but I think the perl -ane
can take multiple files as input.
Perl equivalent of cut -c1-2
perl -alne 'print substr($_,0,2)'
精彩评论