Год и месяц группы awk от даты в столбце 1 и сумма группы в столбце 2

Если у вас есть переименование на основе Perl (иногда известное как prename ), это действительно возможно. Если вы понимаете регулярные выражения, это даже просто.

rename -n 's!^(\d+) - (.*)\.(...)$!$2 ($1).$3!' *.avi

При этом имя исходного файла разбивается на три компонента. В первом примере это будут

  • 1937
  • Белоснежка и семь гномов
  • avi

Они назначены на $ 1 , $ 2 , $ 3 в команде переименовать . (Это не переменные bash .) Затем он снова объединяет их вместе в другом порядке.

Если вас устраивает предложенный результат, измените -n на -v или даже полностью удалите его.

5
05.03.2019, 01:29
4 ответа

Другой awkподход:

$ awk -F'[- ]' '{a[$1"-"$2]+=$NF}END{for(i in a){print i,a[i]}}' file | sort
2018-02 22
2019-01 213
2018-03 13
2018-04 0

В качестве альтернативы Perl:

$ perl -lne '/(.*)-.+ (\d+)/; $k{$1}+=$2 }{ print "$_ $k{$_}" for sort keys(%k)' file 
2018-02 22
2018-03 13
2018-04 9
2019-01 213
1
27.01.2020, 20:40

Вот еще один способ сортировки вывода без использования внешних двоичных файлов, таких какsort:

awk '{arr[substr($0,0,7)]+=$2}END{a=asorti(arr,sort); for(i=1;i<=a;i++) print sort[i], arr[sort[i]]}' infile.
0
27.01.2020, 20:40

Использованиеcsvsqlизcsvkit:

csvsql -d' ' -H --tables file --query "
  select substr(a,1,7) as the_date,sum(b)
  from file
  group by the_date;
" <(tr -s ' ' < file)

Выход:

the_date,sum(b)
2018-02,22
2018-03,13
2018-04,9
2019-01,213
0
27.01.2020, 20:40

Попробуйте это

$ awk '{a[substr($0,0,7)]+=$2}END{for(b in a){print b,a[b]}}' myfile
2018-02 22
2019-01 213
2018-03 13
2018-04 9
$

Для сортировки добавьтеsort

$ awk '{a[substr($0,0,7)]+=$2}END{for(b in a){print b,a[b]}}' myfile | sort
2018-02 22
2018-03 13
2018-04 9
2019-01 213
$
4
27.01.2020, 20:40

Теги

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