Bash: как извлечь из массива самые длинные пути к каталогам? - PullRequest
2 голосов
/ 22 февраля 2020

Я поместил вывод команды find в массив следующим образом:

pathList=($(find /foo/bar/ -type d))

Как извлечь самые длинные пути, найденные в массиве, если массив содержит несколько самых длинных путей одинаковой длины?:

echo ${pathList[@]}
/foo/bar/raw/
/foo/bar/raw/2020/
/foo/bar/raw/2020/02/
/foo/bar/logs/
/foo/bar/logs/2020/
/foo/bar/logs/2020/02/

После извлечения я бы хотел присвоить /foo/bar/raw/2020/02/ и /foo/bar/logs/2020/02/ другому массиву.

Спасибо

1 Ответ

4 голосов
/ 22 февраля 2020

Не могли бы вы попробовать следующее. Это должно вывести самый длинный массив (может быть кратным по числу одинаковой максимальной длины), позже вы можете назначить его массиву.

echo "${pathList[@]}" |
awk -F'/' '{max=max>NF?max:NF;a[NF]=(a[NF]?a[NF] ORS:"")$0} END{print a[max]}'


Я только что создал тестовый массив с значения, предоставленные вами и проверенные следующим образом:

arr1=($(printf '%s\n' "${pathList[@]}" |\
awk -F'/' '{max=max>NF?max:NF;a[NF]=(a[NF]?a[NF] ORS:"")$0} END{print a[max]}'))

Когда я вижу содержимое нового массива, они выглядят следующим образом:

echo  "${arr1[@]}"
/foo/bar/raw/2020/02/
/foo/bar/logs/2020/02/

Объяснение awk код: Добавление подробного объяснения для awk кода.

awk -F'/' '                        ##Starting awk program from here and setting field separator as / for all lines.
{
  max=max>NF?max:NF                ##Creating variable max and its checking condition if max is greater than NF then let it be same else  set its value to current NF value.
  a[NF]=(a[NF]?a[NF] ORS:"")$0     ##Creating an array a with index of value of NF and keep appending its value with new line to it.
}
END{                               ##Starting END section of this program.
  print a[max]                     ##Printing value of array a with index of variable max.
}'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...