Один путь состоит в том, чтобы использовать шаблоны с -I
и -P
переключатели:
tree -f -I "bin|unitTest" -P "*.[ch]|*.[ch]pp." your_dir/
-f
печатает полный путь для каждого файла, и -I
исключает файлы в шаблоне, здесь разделенном вертикальной панелью. -P
переключатель включает только файлы, перечисленные в сопоставлении с образцом определенное расширение.
Параметр СТРОКИ не заключается в кавычки так 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.
Необходимо всегда заключать расширения в кавычки, Вы более вероятно повредите что-то, не заключая расширения в кавычки, чем путем заключения в кавычки им.
Очень полезный параметр в 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
Выполнить в нем ksh93
:
set -f
IFS=' ' # two spaces
set -- $LINE
printf '%s\n' "$9"
Удвоение пространства удаляет специальное поведение, которым последовательности пробелов рассматривают как один и продвижение, и конечные пробелы проигнорированы как в zsh
.
IFS
разделение, сделанное по-другому в ударе?
– iruvar
01.11.2013, 19:24
awk
но с Вами не заключение в кавычки$LINE
переданныйecho
(и использованиеecho
btw) – Stéphane Chazelas 01.11.2013, 17:21