используя awk, чтобы разделить строку на одиночные пробелы, не кратные

Я пытаюсь разделить строку, в которой я не контролирую формат. Если отсутствуют параметры 7 и 8, что возможно, они будут заменены пробелом, поэтому я бы закончил,

field1 field2 field3 field4 field5 field6 field9 

На данный момент в этой ситуации поле 9 читается как поле 7. Многие поиски привели меня к мысли, что следующее должно работать, но это не делается. Вероятно, это небольшая синтаксическая ошибка с моей стороны, но я не могу ее заметить.

  • Относительные смещения линии в awk (/ pattern / + 1 или / pattern / -1)
  • Вопрос об awk
  • Удалите строку из определенного поля с помощью awk / sed
  • объединить повторяющиеся строки в столбцах
  • Перенаправление вывода печати на многократные файлы в awk
  • Создание файлов tar из сценария оболочки с текущей меткой времени
  •  word1=`echo $LINE | awk 'BEGIN { FS="[ ]" } ; { print $9 }'` 

  • awk соответствует только 1 линии с одинаковым рисунком
  • Почему sendmail работает по-разному в разных оболочках?
  • распечатать определенную строку из нескольких файлов
  • Как найти все файлы, содержащие различные строки из длинного списка комбинаций строк?
  • Сравните аналогичный файл и не похожие файлы, отображаемые ниже вывода в awk?
  • Печатная строка имеет специальный формат и количество запятых
  • 3 Solutions collect form web for “используя awk, чтобы разделить строку на одиночные пробелы, не кратные”

    Параметр LINE не цитируется, поэтому wordsplitting происходит при расширении $LINE в echo $LINE и к тому времени, когда awk получает какой-либо вход, у вас есть 7 words (как видно оболочке), разделенных одним пробелом. Вы хотите, чтобы эхо выводило его как одно word (опять же, как видно из оболочки), поэтому пробел в вашей строке не искажается до того, как awk сможет обработать его. Это то, что указывает параметр.

     # How you want it to be given to awk: $ printf '<%s> ' "$LINE"; echo <field1 field2 field3 field4 field5 field6 field9> # Your attempt: $ printf '<%s> ' $LINE; echo <field1> <field2> <field3> <field4> <field5> <field6> <field9> 

    Обратите внимание на то, что дополнительные поля пробегаются между полями 6 и 9.

    Вы всегда должны указывать расширения, скорее всего, вы нарушите что-то, не цитируя разложения, а не цитируя их.

    Очень полезным параметром awk при работе с переменной длиной ввода является NF one, количество полей.

     lastword=`echo $LINE | awk '{ print $NF }'` 

    Это всегда будет печатать последний столбец, независимо от недостающих. Если некоторые поля в середине отсутствуют, отсчет с последнего поля также очень хорошо работает.

    Пример файла, в котором отсутствуют / пустые столбцы, заполненные пробелами, например, в вашем примере:

     line1 field1 field2 field3 field4 field5 field6 field7 field8 field9 line2 field1 field2 field3 field4 field5 field6 field8 field9 line3 field1 field2 field3 field4 field5 field8 field9 

    а также

     awk '{print $1 " " $2 " " $(NF-1) " " $NF}' file line1 field1 field8 field9 line2 field1 field8 field9 line3 field1 field8 field9 

    Сделать это в ksh93 :

     set -f IFS=' ' # two spaces set -- $LINE printf '%s\n' "$9" 

    Удвоение пространства устраняет особое поведение, при котором последовательности пространств рассматриваются как одно, а начальные и конечные пробелы игнорируются, как в zsh .

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