Вывод Awk в Perl не работает должным образом - PullRequest
0 голосов
/ 04 июня 2018

Я пишу простой Perl-скрипт, который предназначен для вывода второго столбца внешнего текстового файла (столбцы один и два разделяются запятой).

Я использую AWK, потому что я 'Я знаком с ним.

Это мой сценарий:

use v5.10;
use File::Copy;
use POSIX;

$s = `awk -F ',' '\$1==500 {print \$2}' STD`;
say $s;

Содержимое локального файла "STD":

CIR,BS  
60,90
70,100
80,120
90,130
100,175
150,120
200,260
300,500
400,600
500,850
600,900

Мой вывод очень странныйи он печатает нужный «850», но также печатает трейлер строки и новую строку!

ka@man01:$ ./test.pl 
850

ka@man01:$

Проблема не только в печати.Мне нужно использовать переменную, сгенерированную awk ", т.е. переменную $ s), но эта переменная также зарезервирована с длинной строкой и новой строкой!

Не могли бы вы, ребята, помочь?

Спасибовы.

Ответы [ 3 ]

0 голосов
/ 04 июня 2018

perl может делать многие вещи, которые awk может делать.Вот что-то похожее, что заменяет всю вашу Perl-программу:

$ perl -naF, -le 'chomp; print $F[1] if $F[0]==500' STD
850

-n создает цикл while вокруг вашего аргумента -e.

-a разбивает каждую строку на @F, а -F позволяет указать разделитель.Поскольку вы хотите разделить поля запятой, вы используете -F,.

. -l добавляет новую строку каждый раз, когда вы звоните print.

Аргумент -e - это программа для запуска (с добавлением while из -n).chomp удаляет новую строку из вывода.Вы получаете новую строку в выходных данных, потому что вы используете последнее поле в строке.-l добавляет новую строку при печати;это важно, когда вы хотите извлечь поле в середине строки.

0 голосов
/ 04 июня 2018

Причина, по которой вы получаете 2 новых строки:

  1. оператор обратного удара не удаляет завершающий символ новой строки из выходных данных awk.$s содержит "850\n"
  2. функция say добавляет новую строку к строке.У вас есть say "850\n", что совпадает с print "850\n\n"
0 голосов
/ 04 июня 2018

Я бы предположил, что вы идете по грязной дороге, пытаясь встроить awk в perl в первую очередь.Почему бы вместо этого:

open ( my $input, '<', 'STD' ) or die $!;
while ( <$input> ) {
    s/\s+\z//;
    my @fields = split /,/; 
    print $fields[1], "\n" if $fields[0] == 500; 
} 

Но вероятная проблема заключается в том, что вы не обрабатываете перевод строки, а say добавляет дополнительный.Попробуйте вместо этого использовать print или chomp в результирующей строке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...