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

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

field1 field2 field3 field4 field5 field6 field9 

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

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

  • Как я могу пропустить пустые файлы с sed?
  • Есть ли способ отобразить все сценарии, вызываемые из другого скрипта?
  • Учебное пособие по отображению ключей в KSH в режиме EMACS
  • выход из ловушки в тире против ksh и bash
  • Как я могу увидеть историю команды «at» в AIX?
  • Crontab Triple Redirect
  • awk + print awk вывод в одной строке
  • KSH / bash для создания файлов динамически
  • 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

    Как получить качественное шифрование на диске Debian после установки?

    почему / dev / dsp исчез из SUSE

    Не удается войти через SSH с новым пользователем (подключение к 10.0.2.142 закрыто).

    libpam-ck-connector, вызывающий apt-get to fail

    Как я могу узнать, к какой организации принадлежит специальный инструмент командной строки?

    Возможно ли зарегистрировать «виртуальные» идентификаторы пользователей / групп в системе Linux?

    Мышь и клавиатура не работают в Windows 8.1 после двойной загрузки Ubuntu?

    Подсказка для ввода в пост-инсталляционный скрипт в dpkg

    «Тар» – результат поиска, сохраняющий структуру каталогов

    Системный вызов getrusage: что такое «максимальный размер резидентного набора»

    Что такое «сборка ядра», и где я могу ее получить?

    PHP exec и amixer

    почему df получить результат несовместим с lsblk?

    Проверка пользователя

    Как я могу позволить людям установить мой пакет с помощью apt-get?

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