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

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

field1 field2 field3 field4 field5 field6 field9 

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

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

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 .

  • Как получить ответ от любого URL-адреса?
  • как избежать необычных / uniq-символов из сценариев ожидания?
  • Как выполнить операцию «&» последовательно
  • Как получить текущую дату и время в формате YYYYMMDDHHMMSS в ksh88?
  • Непонятно о поведении моего скрипта при записи в файл журнала
  • Трубы Bash vs ksh
  • Как печатать даты между двумя разными датами
  • Как иметь отдельную историю команд для разных сеансов для одного и того же пользователя?
  • FOR цикл не циклический
  • Использование sed для цветного вывода из команды на Solaris
  • Как сортировать по двум полям чисел
  • деформировать, но сохранить -v подробный вывод отдельно от STDERR
  • Interesting Posts

    пересылать весь трафик mysql в туннель ssh

    Получить строки только с определенными полями

    Вставьте переменную и сохраните переменную

    NFS: очень медленное размонтирование при перезагрузке / выключении

    Могу ли я сказать, приостановлена ​​ли `ssh` клиентская сторона?

    Почему некоторые команды имеют man-страницы и другие команды –help?

    синтаксис grep для поиска строк с одиночными кавычками?

    Освободите все функциональные клавиши (F1-F12) для gnome-terminal

    Я случайно ввел свой пароль в поле входа, он все еще безопасен?

    Создайте базу данных «теневого» RPM?

    Получение ошибок Python всякий раз, когда я пытаюсь использовать терминал в Linux Mint

    Удаление последовательных строк новой строки с помощью ed

    изменение структуры каталога по умолчанию Unix

    Новичок пытается написать простой графический интерфейс для простого сценария bash

    Переменная с двоеточием, тире в if-then-else: `if `

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