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

Один путь состоит в том, чтобы использовать шаблоны с -I и -P переключатели:

tree -f -I "bin|unitTest" -P "*.[ch]|*.[ch]pp." your_dir/

-f печатает полный путь для каждого файла, и -I исключает файлы в шаблоне, здесь разделенном вертикальной панелью. -P переключатель включает только файлы, перечисленные в сопоставлении с образцом определенное расширение.

6
02.11.2013, 01:35
3 ответа

Параметр СТРОКИ не заключается в кавычки так 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> 

Заметьте, как дополнительного пробела не стало между field6 и 9.

Необходимо всегда заключать расширения в кавычки, Вы более вероятно повредите что-то, не заключая расширения в кавычки, чем путем заключения в кавычки им.

8
27.01.2020, 20:23
  • 1
    Спасибо. Однажды я пойму awk. Вероятно, в то же время они заменяют его чем-то лучше. –  dazedandconfused 01.11.2013, 17:05
  • 2
    @dazedandconfused, проблема не с awk но с Вами не заключение в кавычки $LINE переданный echo (и использование echo btw) –  Stéphane Chazelas 01.11.2013, 17:21
  • 3
    @dazedandconfused, я вдавался в немного большее количество подробностей со своим ответом. –  llua 01.11.2013, 17:54

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

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
4
27.01.2020, 20:23

Выполнить в нем ksh93:

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

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

2
27.01.2020, 20:23
  • 1
    +1. Я вижу эту работу с ksh, но не ударом; IFS разделение, сделанное по-другому в ударе? –  iruvar 01.11.2013, 19:24
  • 2
    Да, та функция находится только в zsh и ksh93 –  Stéphane Chazelas 01.11.2013, 19:45

Теги

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