Распечатайте определенные поля каждой строки, пока с маркером не встречаются, затем распечатайте целые строки до конца файла

Я рекомендовал бы использовать clonezilla. Вот хорошее учебное руководство, которое обойдет Вас, через большинство как клонировать Вас существующий раздел VMs к новому, который Вы создали на 2-м виртуальном устройстве.

0
27.12.2013, 01:41
3 ответа

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

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 парень: я уверен, что это может быть лучше оптимизировано.

2
28.01.2020, 02:37
  • 1
    +1 На самом деле Вы сделали вполне прилично. Вы не допускаете его, но Вы могли бы также быть awk парнем. OP просила awk, таким образом, это должно быть ответом. Мой ответ sed был просто предложением. –  alvits 26.12.2013, 21:50

Это легче сделанный в sed.

sed -n '1,/END_OF_LINE/ {s/^\([^ ]* \)\{3\}\(.*\)$/\2/p};/END_OF_LINE/,$p' file.txt
0
28.01.2020, 02:37
  • 1
    Почему не просто s/^\([^ ]* \)\{3\}//p...? –  Joseph R. 26.12.2013, 21:12
  • 2
    Да, который будет работать и намного более простой и легкий для чтения. Причина я использовал вышеупомянутое, состоит в том, чтобы быть гибкой. Если вход внезапно имеет больше чем 6 записей затем, это столь же просто как удаление '$' в sed операторе, и это все еще распечатает корректный результат. На самом деле я не должен был добавлять $ во-первых. –  alvits 26.12.2013, 21:38
  • 3
    Вы могли объяснить это немного? Кроме того, это, кажется, не работает для строк прежде /END_OF_LINE/, это печатает все поля от 4 на. OP только хочет поля 4 - 6. Плюс, если там ведут пробелы как в примере OP, он будет рассматривать первое пространство как поле и печатать все от 3-го на. –  terdon♦ 27.12.2013, 15:44

Вот пара. awk каждый - просто решение Joseph, но записанный более кратким способом. Все они полагаются на ту же основную идею. Просто установите переменную на 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опции:

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

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

0
28.01.2020, 02:37

Теги

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