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

Вы пытались отключить автозапуск во время загрузки? Это, казалось, работало для кого-то в ссылке, которую вы дали.

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

6 ответов

Учитывая любое возможное имя файла из этого каталога:

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, если третье поле начинается с 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 получить уникальность:

printf '%s\0' cpu-*-201* печатает имена файлов, разделенные NUL

printf '%s\0' cpu-*-201*, печатает имена файлов, разделенные с помощью NUL

printf '%s\n' cpu-*-201* | sed -E 's/^(.*)-201.*/\1/' | sort -u awk, устанавливает разделитель записи как NUL и помещает - в раздел первые два поля (с - между ними) в качестве ключа ассоциативного массива a, если третье поле начинается с 201. В конце мы просто печатаем ключи массива с помощью {a[$1"-"$2]} END{for(i in a) print i}

awk устанавливает разделитель записи как NUL и помещает - разделенные первые два поля (с - между ) в качестве ключа ассоциативного массива a, если третье поле начинается с 201. В конце мы просто печатаем ключи массива с помощью {a[$1"-"$2]} END{for(i in a) print i}

printf '%s\n' cpu-*-201* | cut -d- -f1,2 | sort -u

sed:

% 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
ответ дан 18 July 2018 в 12:25

Решение для 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
ответ дан 18 July 2018 в 12:25

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

$ 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
ответ дан 18 July 2018 в 12:25

Учитывая любое возможное имя файла из этого каталога:

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, если третье поле начинается с 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 получить уникальность:

printf '%s\0' cpu-*-201* печатает имена файлов, разделенные NUL

printf '%s\0' cpu-*-201*, печатает имена файлов, разделенные с помощью NUL

printf '%s\n' cpu-*-201* | sed -E 's/^(.*)-201.*/\1/' | sort -u awk, устанавливает разделитель записи как NUL и помещает - в раздел первые два поля (с - между ними) в качестве ключа ассоциативного массива a, если третье поле начинается с 201. В конце мы просто печатаем ключи массива с помощью {a[$1"-"$2]} END{for(i in a) print i}

awk устанавливает разделитель записи как NUL и помещает - разделенные первые два поля (с - между ) в качестве ключа ассоциативного массива a, если третье поле начинается с 201. В конце мы просто печатаем ключи массива с помощью {a[$1"-"$2]} END{for(i in a) print i}

printf '%s\n' cpu-*-201* | cut -d- -f1,2 | sort -u

sed:

% 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
ответ дан 24 July 2018 в 19:57

Решение для 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
ответ дан 24 July 2018 в 19:57

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

$ 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
ответ дан 24 July 2018 в 19:57
  • 1
    Хм, я бы предложил процитировать разделитель (оставив их может привести к тому, что они останутся, когда они понадобятся) – ADDB 31 May 2017 в 18:11

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

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