find . ! -name . -prune -type d -exec sh -c '
yes | head -1 |
find "$1/." ! -name . -prune -type f \
\( -name '*.[mM][pP]3' -o -name '.*.[mM][pP]3' \) \
-exec sh -c "read foo" \; -print
' {} {} \; | wc -l |
sh -c 'read n;echo "There are $n dirs with mp3 files."'
Внешний "find" выбирает все подкаталоги в текущем каталоге. а затем спускается в каждый из них и находит в них нерекурсивно, если они содержат хотя бы 1 mp3-файл, включая скрытый и нечувствительный к регистру способ.
Использование хэша массивов в Perl (со склейками для удаления и повторной вставки поля агрегата после каждого слияния):
$ perl -F\; -alne '
if($.==1) {
print;
next;
}
if(!exists $HoA{$F[4]}) {
$HoA{$F[4]} = [ @F ];
}
else {
splice @{ $HoA{$F[4]} }, 2, 0, join ",", (splice @{ $HoA{$F[4]} }, 2, 1), $F[2];
}
END {
for $k (keys %HoA) {
print join ";", @{ $HoA{$k} };
}
}
' data
Domain Name;ID;Machine;Environment;ENV URL;Start Date;End Date;Disk Size;Used
matrix.localhost.com;XY6124;Machine-apache-bcp1,Machine-apache-prd1;test;test.matrix.localhost.com;2 April 2013 08:12:10 GMT+01:00;2 April 2018 08:42:10 GMT+01:00;1024;External
orion.uk.localhost.com;XY01123;Machine-apache-ua01,Machine-apache-ua02;uat;uat.orion.uk.localhost.com;5 August 2015 16:54:08 GMT+01:00;2 August 2025 16:54:08 GMT+01:00;2048;Internal
matrix.localhost.com;XY6124;Machine-apache-dev1,Machine-apache-dev2;dev;dev.matrix.localhost.com;16 April 2013 06:32:28 GMT+01:00;16 April 2018 07:02:28 GMT+01:00;1024;External
matrix.localhost.com;XY6124;Machine-apache-uat1,Machine-apache-uat2;uat;uat.matrix.localhost.com;16 April 2013 07:06:33 GMT+01:00;16 April 2018 07:36:33 GMT+01:00;1024;External
Upgrade.uk.localhost.com;IN022345;Machine-apache-pf01,Machine-apache-pf02;per;per.Upgrade.uk.localhost.com;5 August 2015 16:54:08 GMT+01:00;2 August 2025 16:54:08 GMT+01:00;2048;Internal
В качестве альтернативы, используя GNU datamash
(с вырезом
, чтобы удалить лишнее поле groupby
):
$ datamash -Hst\; groupby 5 unique 1-2 collapse 3 unique 4-9 < data | cut -d\; -f2-
unique(Domain Name);unique(ID);collapse(Machine);unique(Environment);unique(ENV URL);unique(Start Date);unique(End Date);unique(Disk Size);unique(Used)
matrix.localhost.com;XY6124;Machine-apache-dev1,Machine-apache-dev2;dev;dev.matrix.localhost.com;16 April 2013 06:32:28 GMT+01:00;16 April 2018 07:02:28 GMT+01:00;1024;External
Upgrade.uk.localhost.com;IN022345;Machine-apache-pf01,Machine-apache-pf02;per;per.Upgrade.uk.localhost.com;5 August 2015 16:54:08 GMT+01:00;2 August 2025 16:54:08 GMT+01:00;2048;Internal
matrix.localhost.com;XY6124;Machine-apache-bcp1,Machine-apache-prd1;test;test.matrix.localhost.com;2 April 2013 08:12:10 GMT+01:00;2 April 2018 08:42:10 GMT+01:00;1024;External
matrix.localhost.com;XY6124;Machine-apache-uat1,Machine-apache-uat2;uat;uat.matrix.localhost.com;16 April 2013 07:06:33 GMT+01:00,22 March 2013 06:16:10 GMT;16 April 2018 07:36:33 GMT+01:00,22 March 2018 06:46:10 GMT;1024;External
orion.uk.localhost.com;XY01123;Machine-apache-ua01,Machine-apache-ua02;uat;uat.orion.uk.localhost.com;5 August 2015 16:54:08 GMT+01:00;2 August 2025 16:54:08 GMT+01:00;2048;Internal
Может быть, есть более элегантные способы с awk
, но вот возможный сценарий.
BEGIN { FS=";" ; OFS=";" }
NR==1 { print $0 }
NR>1 {
if ( b[$5]=="" ) {
a[$5]=$0
b[$5]=$3
}
else {
b[$5]=b[$5]","$3
$3=b[$5]
a[$5]=$0
}
}
END {
for (c in a) {
print a[c]
}
}
Объяснение:
BEGIN
установить точку с запятой в качестве разделителей полей ввода и вывода NR == 1
просто напечатать первую строку (заголовок), никаких действий не требуется NR> 1
для других строк:
b [$ 5]
- это массив, индексированный значениями поля 5, содержащий (растущий) список разделенных запятыми записей поля 3 a [$ 5]
- это массив, индексированный значениями поля 5, содержащий измененные строки (т. е. с включенными значениями поля 3, разделенного запятыми) b [$ 5]
не задано ( первое вхождение этого значения), установите a [$ 5]
как строку и b [$ 5]
как поле 3 b [$ 5]
установлено), добавьте поле 3 с разделителем-запятой к b [$ 5]
, замените поле 3 в этой строке этим, а затем замените a [$ 5]
этой измененной строкой END
для всех значений индекса c
массива a
распечатать элемент массива (т.е. желаемую строку) Я действительно не знаю w как awk
сортирует вывод, но это мой результат:
Domain Name;ID;Machine;Environment;ENV URL;Start Date;End Date;Disk Size;Used
Upgrade.uk.localhost.com;IN022345;Machine-apache-pf01,Machine-apache-pf02;per;per.Upgrade.uk.localhost.com;5 August 2015 16:54:08 GMT+01:00;2 August 2025 16:54:08 GMT+01:00;2048;Internal
matrix.localhost.com;XY6124;Machine-apache-dev1,Machine-apache-dev2;dev;dev.matrix.localhost.com;16 April 2013 06:32:28 GMT+01:00;16 April 2018 07:02:28 GMT+01:00;1024;External
matrix.localhost.com;XY6124;Machine-apache-uat1,Machine-apache-uat2;uat;uat.matrix.localhost.com;22 March 2013 06:16:10 GMT;22 March 2018 06:46:10 GMT;1024;External
orion.uk.localhost.com;XY01123;Machine-apache-ua01,Machine-apache-ua02;uat;uat.orion.uk.localhost.com;5 August 2015 16:54:08 GMT+01:00;2 August 2025 16:54:08 GMT+01:00;2048;Internal
matrix.localhost.com;XY6124;Machine-apache-bcp1,Machine-apache-prd1;test;test.matrix.localhost.com;2 April 2013 08:12:10 GMT+01:00;2 April 2018 08:42:10 GMT+01:00;1024;External
У вас там sqlite
? Я правильно вас понял, как соединять строки?
sqlite> .separator ;
sqlite> .import file.txt alldata
sqlite> select "ENV URL", group_concat("Machine") from alldata group by "ENV URL";
dev.matrix.localhost.com;Machine-apache-dev1,Machine-apache-dev2
per.Upgrade.uk.localhost.com;Machine-apache-pf01,Machine-apache-pf02
test.matrix.localhost.com;Machine-apache-bcp1,Machine-apache-prd1
uat.matrix.localhost.com;Machine-apache-uat1,Machine-apache-uat2
uat.orion.uk.localhost.com;Machine-apache-ua01,Machine-apache-ua02
Или неинтерактивный:
echo 'select "ENV URL", group_concat("Machine") from alldata group by "ENV URL";' \
| sqlite3 -separator ";" -cmd ".import file.txt alldata" -batch