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

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

field1 field2 field3 field4 field5 field6 field9 

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

 word1=`echo $LINE | awk 'BEGIN { FS="[ ]" } ; { print $9 }'` 

  • Вычтите плавающие числа в сценарии оболочки
  • $ 2 (ссылка на поле) в awk BEGIN не работает
  • Как сделать «Ctrl + L» для очистки экрана в ksh под Red hat linux?
  • Как создать псевдоним, который принимает аргумент в KornShell
  • bash или Ksh и команда exec
  • Используйте переменную ссылку «внутри» другой переменной
  • perl one liner + как соответствовать IP-адресу, который находится в поле файла first / sec
  • Ошибка при вычитании двух отрицательных чисел в ksh: «назначение требует lvalue»
  • 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 .

    Interesting Posts

    Могу ли я изменить основные значки – Raspbian Jessie

    Не удалось запустить httpd и отобразить ошибку

    Sniffing машина VirtualBox за NAT

    Как смонтировать диск с одного компьютера на другой?

    Почему команда «hwclock» применяет положительное смещение для местного времени, тогда как команда «date» применяет отрицательное смещение?

    Эмпатия – Монетный двор Linux 17.1 Корица

    Untar File.tar.gz из оболочки с вложенным .tar

    Можно ли отключить права доступа к файлу файловой системы ext3 или ext4?

    Как автоматически загружать новый VID и PID в модуль usb_serial

    Команда nmcli принимает только первую строку ssid?

    Можно ли изменить палитру по умолчанию для терминала xterm-256color?

    Переключение на другую оболочку без копирования переменных среды

    Как ядро ​​«отказывается» от контроля инициализации, специфичной для дистрибутива?

    Как разрешить сценарию оболочки bash цикл для 3 повторений перед выходом (подсказка для имени пользователя / пароля)

    Solaris 11.1 и ipfilter

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