#linux #shell #awk
#linux #оболочка #awk
Вопрос:
Я пытаюсь разобраться в приведенной ниже команде;
find ./ -type f |
awk -F / -v OFS=/ '{$NF="";dir[$0] } END {for (i in dir) print dir[i]i}'
вывод выглядит следующим образом:
6./Release_1_18_1_0_06_26/metadata/3_Control_Files/
5./Release_1_18_1_0_06_26/metadata/7_SAS_Code/
5./Release_1_18_1_0_06_26/others/1_content/
1./.cache/pip/selfcheck/
2./Release_1_18_1_0_06_26/metadata/5_Status/
1./Release_1_18_1_0_06_26/compute/2_packages/
1./sasuser.v94/
4./metadata/FR1_Release_1.17.1.1/3_Control_Files/
4./Release_1_18_1_0_06_26/metadata/6_Patches/
Эта команда подсчитывает количество инкодов в текущем пути. Однако я не понял {$NF="";dir[$0] } END {for (i in dir) print dir[i]i}
, особенно dir[$0]
. кто-нибудь может это объяснить?
Ответ №1:
Не могли бы вы, пожалуйста, ознакомиться со следующим подробным объяснением кода OP здесь.
find ./ -type f | ##Running find command to find files in current directory and passing output as input to awk command.
awk -F / -v OFS=/ ' ##Running awk command setting field separator and output field separator as /
{
$NF="" ##Nullifying last field of current line here.
dir[$0] ##creating array dir with current line and keep increasing its value with one here.
}
END{ ##starting END block of this code here.
for(i in dir){ ##traversing through dir array here.
print dir[i]i ##printing index of dir array and it's index here.
}
}'
ПРИМЕЧАНИЕ: END
блок любого awk
кода выполняется, когда Input_file наконец завершается чтением.
Комментарии:
1. Неплохо. dir[$0] может запомнить последний отсчет для своей строки, поэтому массив может увеличить значение.
Ответ №2:
-F /
Указывает awk разделить строку косыми чертами. $0
это целая строка.
$NF=""
заменяет последний элемент в строке (в данном случае имя файла) пустым.
Затем dir[$0]
берет всю строку (после того, как имя файла было удалено) и использует ее в качестве индекса в хэше, увеличивая это значение на единицу. Эффективный подсчет количества элементов, у которых был один и тот же путь.
END
Блок перебирает все ключи в dir[]
хэше, выводя сначала количество, затем имя каталога.