Печать определенных полей каждой строки до тех пор, пока не будет обнаружен маркер, а затем напечатайте целые строки до конца файла

Привет, у меня есть следующий файл

more file.txt 1 2 3 4 4 2 23 4 5 23 2 3 END_OF_LINE 1 3 7 4 2 23 4 6 7 4 2 1 5 

Как печатать только поля 4 и 5 и 6 из каждой строки до тех пор, пока не встретится строка END_OF_LINE , а затем, начиная с этой точки до конца файла, распечатайте всю строку?

У меня есть только частичное решение

  awk '{print $4" "$5" "$6}' 

Пример: желаемый выход для данного входа:

  awk syntax ..... file.txt 4 4 2 23 2 3 END_OF_LINE 1 3 7 4 2 23 4 6 7 4 2 1 5 

  • Как заменить заголовок файла заголовком другого файла
  • Извлечение линий на основе условий
  • sed разделить верилогическую шину на отдельный порт
  • nmap-скрипт, необходимый для вывода текста в формат csv
  • Объединение нескольких полей отдельно на основе одной (ключевой) колонки
  • Можно ли добавлять последовательные столбцы в AWK
  • Объединить диапазон столбцов с одним и тем же ключом
  • Еще одна синтаксическая ошибка около неожиданного токена `('
  • 3 Solutions collect form web for “Печать определенных полей каждой строки до тех пор, пока не будет обнаружен маркер, а затем напечатайте целые строки до конца файла”

    Вот что я придумал:

     awk ' /END_OF_LINE/{ matched = 1} # When you find END_OF_LINE set the matched flag { if( matched == 0) # If you haven't matched END_OF_LINE yet print $4" "$5" "$6 # ...print the required fields else # If you have already found END_OF_OLINE print $0 # ...print the whole line }' your_file 

    но я не парень awk : я уверен, что это может быть улучшено.

    Это проще сделать в sed.

     sed -n '1,/END_OF_LINE/ {s/^\([^ ]* \)\{3\}\(.*\)$/\2/p};/END_OF_LINE/,$p' file.txt 

    Вот пара. Один awk – это решение Джозефа, но написанное более сжатым способом. Все они полагаются на одну и ту же основную идею. Просто установите переменную в 1, когда найденная строка найдена и проверьте значение переменной, чтобы решить, что печатать.

    1. awk

       awk '/END_OF_LINE/{ m = 1}(m==0){print $4,$5,$6; next}1;' file.txt 
    2. Perl

       perl -alne '$m++ if /END_OF_LINE/; $m==0? print "@F[3..5]" : print; ' file.txt 

      Магия в настройках perl :

      -a включает режим авторасщепления при использовании с -n или -p. Неявная команда split для массива @F выполняется как первая вещь внутри неявного цикла while, созданного -n или -p.

      Это заставляет его действовать по существу как awk . -n просто означает обработку входного файла по строке, а -l означает добавление новой строки в каждый оператор печати (это означает гораздо больше, но это то, что он здесь делает). Наконец, -e – это просто способ передачи сценария в командной строке.

    Linux и Unix - лучшая ОС в мире.