Как лишить редкие части имен файлов и иметь уникальные части

Вот имена файлов, которые я имею;

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

Каково было бы оптимальное решение?

0
задан 31 May 2017 в 07:47

3 ответа

Я не скажу, что это - "оптимальное решение", но, учитывая

$ 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
2
ответ дан 3 November 2019 в 04:07

Рассмотрение любого возможного имени файла, из того каталога:

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
2
ответ дан 3 November 2019 в 04:07

Решение для Perl

Мы можем использовать 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 команда)

0
ответ дан 3 November 2019 в 04:07

Другие вопросы по тегам:

Похожие вопросы: