Можем ли мы сделать это в perl? - PullRequest
0 голосов
/ 24 февраля 2020

Я хочу, чтобы приведенный ниже awk один вкладыш был переведен на perl. возможно ли это?

awk '{ for(i=1;i<=NF;i++){if(i==NF){printf("%s\n",$NF);}else {printf("%s\t",$i)}}}' file.txt |  awk 'NR > 1'

Первая команда awk удаляет первый пустой столбец, а следующий - первую строку. Ниже находится заголовок файла file.txt

#FILEOUTPUT
       1    137442      2324
    2326    139767      4169
    6491    143936        94

Вывод, который я получаю из этих команд, ниже

1       137442  2324
2326    139767  4169
6491    143936  94

Спасибо, Карти c

1 Ответ

3 голосов
/ 24 февраля 2020

@ Алекс правильно использовал $. - и это не очень распространенная идиома perl (хотя и полезная, как мы видим), но они неправильно обрабатывали лишние пробелы.

Awk полностью понимает, что такое поля, а затем манипулирует полями, и как часть этого, он выполняет большую часть канонализации пробелов.

Perl, OTOH, обычно не вовлекает себя в разделение полей и многим пользователям нравится делать это самим, но он поддерживает это поведение Awk, используя флаг -a.

Так что простая реализация описанного выше шума линии Awk может выглядеть так:

perl -anle 'print join("\t",@F) if $. > 1' file.txt

Объяснение:

  • -a: инициировать разделение полей с использованием разделителя полей по умолчанию (который хорошо работает в этом случае) или того, что говорит -F (например, Awk).
  • -n: итерация по входным строкам (аналогично тому, что делают самые внешние {} в Awk). Распространенной альтернативой является -p, который будет означать итерацию по строкам ввода, а затем распечатывать все, что есть в буфере строк после выполнения кода.
  • -l: при печати добавьте новую строку в конце текста (с такими вещами немного легче работать)
  • -e: вот сценарий.

Затем мы просто возьмем массив разделенных полей (@F) и присоединяйся Часто разработчикам нравится просто обращаться к определенным полям с помощью $F[<index>], но здесь нам не нужно l oop - мы можем просто взять список как есть и перенаправить его на join().

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