Как правильно вызвать awk в Perl для распечатывания 3-го последнего поля в строке?

Мой сценарий:

#!/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;

Вывод:

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.

На что это жалуется? Что-то не так с моим сценарием? Не мог понять, почему это говорит The source line is 1.

Какая фиксация необходима моему сценарию?

2
задан 16 May 2014 в 22:18

3 ответа

Вы не должны звонить awk внутренняя часть Ваш perl, программа, perl обеспечивает необходимые функции для выполнения такой операции:

#!/usr/bin/perl -w

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

Эта небольшая программа выводы: 5

4
ответ дан 7 October 2019 в 20:04

Sylvain указал, Вы действительно не должны звонить awk из perl, так как последний может сделать что-либо, что первый может. Однако для ответа на исходный вопрос необходимо i) выйти $ внутренняя часть эти awk, ii) правильно передать переменную Perl подоболочке, которую Вы запускаете (print, что-то совершенно другое в оболочке). Что-то как:

#!/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;
4
ответ дан 7 October 2019 в 20:04

То же самое может быть сделано с cut как так:

cut -d ' ' -F <field>
0
ответ дан 7 October 2019 в 20:04

Другие вопросы по тегам:

Похожие вопросы: