Como invocar corretamente o awk no Perl para imprimir o terceiro último campo em uma linha?

2

Meu script é:

#!/usr/bin/perl -w

my $line="1 2 3 4 5 6 7";
print $line;
my $thirdlast='print $line |awk '{print $(NF-3)}'';
print $thirdlast;

A saída é:

1 2 3 4 5 6 7   awk: 0602-542 There is an extra ) character.
 The source line is 1.
 The error context is
                {print 201 1 >>>  201NF-3) <<< 
 Syntax Error The source line is 1.
 awk: 0602-502 The statement cannot be correctly parsed. The source line is 1.
        awk: 0602-542 There is an extra ) character.

Do que se queixa? Alguma coisa errada com o meu roteiro? Não foi possível entender por que isso diz The source line is 1 .

Qual correção é necessária para o meu script?

    
por Qiang Xu 16.05.2014 / 20:12

3 respostas

4

Você não precisa chamar awk dentro do seu programa perl , perl fornece as funções necessárias para realizar essa operação:

#!/usr/bin/perl -w

my $line="1 2 3 4 5 6 7";
my @tab = split(/\s+/, $line);
print $tab[-3],"\n";

Este pequeno programa gera: 5

    
por Sylvain Pineau 16.05.2014 / 20:33
4

Um Sylvain apontou, você realmente não precisa chamar awk de dentro de perl , pois o último pode fazer qualquer coisa que o primeiro possa. No entanto, para responder sua pergunta original, você precisa i) escapar o $ dentro do awk , ii) passar corretamente sua variável Perl para o subshell que você inicia ( print é algo completamente diferente no shell). Algo como:

#!/usr/bin/perl -w

my $line="1 2 3 4 5 6 7";
## Use echo, not print and escape the $ in $(NF-3)
my $thirdlast='echo "$line" |awk '{print $(NF-3)}'';
print $thirdlast;
    
por terdon 11.06.2014 / 14:31
0

O mesmo pode ser feito com cut da seguinte forma:

cut -d ' ' -F <field>
    
por fer866 19.06.2017 / 17:10