Вот имена файлов, которые я имею;
cpu-system-2016-05-06
cpu-system-2017-05-08
cpu-wait-2017-05-08
cpu-wait-2016-05-06
cpu-wait-2017-05-07
cpu-interrupt-2017-05-08
cpu-interrupt-2016-05-07
cpu-softirq-2017-05-07
cpu-softirq-2017-05-08
cpu-softirq-2017-05-06
Я хотел бы проанализировать имена через -201
и примите первую часть во внимание для получения такого вывода;
cpu-system
cpu-wait
cpu-interrupt
cpu-softirq
Каково было бы оптимальное решение?
Я не скажу, что это - "оптимальное решение", но, учитывая
$ ls cpu*
cpu-interrupt-2016-05-07 cpu-softirq-2017-05-06 cpu-softirq-2017-05-08 cpu-system-2017-05-08 cpu-wait-2017-05-07
cpu-interrupt-2017-05-08 cpu-softirq-2017-05-07 cpu-system-2016-05-06 cpu-wait-2016-05-06 cpu-wait-2017-05-08
затем
$ ls cpu* | cut -d- -f1,2 | uniq
cpu-interrupt
cpu-softirq
cpu-system
cpu-wait
Рассмотрение любого возможного имени файла, из того каталога:
printf '%s\0' cpu-*-201* | \
awk -F'-' 'BEGIN{RS="\0"} $3~/^201/ {a[$1"-"$2]} END{for(i in a) print i}'
printf '%s\0' cpu-*-201*
печатает имена файлов, разделенные NUL
awk
устанавливает разделитель записей как NUL, и помещенный -
разделенный сначала два поля (с a -
промежуточный) как ключ ассоциативного массива a
, если третье поле запускается с 201
. В конце мы просто печатаем ключи массива с {a[$1"-"$2]} END{for(i in a) print i}
Если Вы хотите, можно избавиться от массива и рычагов sort
после печати первых двух полей, разделенных -
:
printf '%s\0' cpu-*-201* | \
awk -F'-' 'BEGIN{RS="\0"} $3~/^201/ {print $1"-"$2}' | sort -u
Не принимая необычного имени файла, существует много опций, вся справка взятия от sort -u
получить уникальность:
grep
, с PCRE:
printf '%s\n' cpu-*-201* | grep -Po '^.*(?=-201)' | sort -u
sed
:
printf '%s\n' cpu-*-201* | sed -E 's/^(.*)-201.*/\1/' | sort -u
awk
:
printf '%s\n' cpu-*-201* | awk -F'-' '$3~/^201/ {a[$1"-"$2]} END{for(i in a) print i}'
printf '%s\n' cpu-*-201* | awk -F'-' '$3~/^201/ {print $1"-"$2}' | sort -u
cut
, принимая стабильные поля, это вслепую становится первым два поля:
printf '%s\n' cpu-*-201* | cut -d- -f1,2 | sort -u
Пример:
% printf '%s\n' cpu-*-201*
cpu-interrupt-2016-05-07
cpu-interrupt-2017-05-08
cpu-softirq-2017-05-06
cpu-softirq-2017-05-07
cpu-softirq-2017-05-08
cpu-system-2016-05-06
cpu-system-2017-05-08
cpu-wait-2016-05-06
cpu-wait-2017-05-07
cpu-wait-2017-05-08
% printf '%s\0' cpu-*-201* | awk -F'-' 'BEGIN{RS="\0"} $3~/^201/ {a[$1"-"$2]} END{for(i in a) print i}'
cpu-softirq
cpu-interrupt
cpu-wait
cpu-system
% printf '%s\0' cpu-*-201* | awk -F'-' 'BEGIN{RS="\0"} $3~/^201/ {print $1"-"$2}' | sort -u
cpu-interrupt
cpu-softirq
cpu-system
cpu-wait
% printf '%s\n' cpu-*-201* | grep -Po '^.*(?=-201)' | sort -u
cpu-interrupt
cpu-softirq
cpu-system
cpu-wait
% printf '%s\n' cpu-*-201* | sed -E 's/^(.*)-201.*/\1/' | sort -u
cpu-interrupt
cpu-softirq
cpu-system
cpu-wait
% printf '%s\n' cpu-*-201* | awk -F'-' '$3~/^201/ {a[$1"-"$2]} END{for(i in a) print i}'
cpu-interrupt
cpu-softirq
cpu-system
cpu-wait
% printf '%s\n' cpu-*-201* | awk -F'-' '$3~/^201/ {print $1"-"$2}' | sort -u
cpu-interrupt
cpu-softirq
cpu-system
cpu-wait
% printf '%s\n' cpu-*-201* | cut -d- -f1,2 | sort -u
cpu-interrupt
cpu-softirq
cpu-system
cpu-wait
Мы можем использовать Perl для извлечения требуемой части прежде -201
подстрока и объекты хранилища в хеш, где каждая извлеченная строка будет значением ключа.
$ perl -ne '($var=$_)=~s/^(.*)-201(.*)/\1/g;$hash{$var}+=1; END{ do{print }for keys %hash}' input.txt
cpu-system
cpu-softirq
cpu-wait
cpu-interrupt
После того как обработка сделана, в результате только уникальные значения оставят как ключи, хотя примечание, что они не будут в определенном отсортированном порядке (поэтому, если Вы хотите отсортированный вывод, передайте вывод по каналу к sort
команда)