Количество повторяющихся вхождений в CSV?

Во-первых, вам нужно убедиться, что в конце существующего диска есть не менее 1 МБ свободного места. При необходимости измените размер последнего раздела. Затем просто создайте массив raid из обоих дисков (сначала укажите исходный диск). Обязательно используйте переключатель -e 1.0 на mdadm , чтобы убедиться, что метаданные рейда помещаются в конец диска. Он автоматически начнет копирование содержимого исходного диска на новый диск. Вам нужно будет сделать все это при загрузке с другого диска или, по крайней мере, со всеми файловыми системами, смонтированными только для чтения. Перезагрузитесь, когда закончите с этим, затем переустановите grub. Если ваш / etc / fstab использует UUID, это все, что вам нужно сделать; в противном случае вам нужно будет убедиться, что он указывает на / dev / mdXpY вместо / dev / sdapY.

2
16.07.2018, 05:16
4 ответа

Использование массивов вawk

Если поля входного файла разделены одним или несколькими пробельными символами, то разделитель полей объявлять не нужно:

awk 'NR>1 && NF { league[$1][$4]++ } END { for ( team in league ) for ( results in league[team] ) print league[team][results],results,team }' teams.txt

Тот же код, отформатированный для экрана:

awk 'NR>1 && NF { league[$1][$4]++ }
     END { for ( team in league )
           for ( results in league[team] )
           print league[team][results],results,team }' teams.txt

Здесь league[$1][$4]++подсчитывает числа ($4, четвертое поле )побед и поражений для каждой команды ($1, первое поле )в лиге (входной файл ).

NR>1означает, что awkбудет игнорировать заголовок (первой строки ).

Точно так же сокращениеNF(дляNF>0)означает, что awkбудет проверять только строки, содержащие хотя бы одно поле. Другими словами, NFпропускает пустые строки.

Раздел NR>1 && NFпроверяет входной файл и создает массив. Когда это будет завершено, секция ENDраспечатает массив.

Если поля входного файла разделены запятыми -, добавьте BEGIN { FS="," ; OFS=" " }, чтобы установить разделители полей ввода(FS)и вывода(OFS):

awk 'BEGIN { FS="," ; OFS=" " } NR>1 && NF { league[$1][$4]++ } END { for ( team in league ) for ( results in league[team] ) print league[team][results],results,team }' teams.csv

Тот же код, отформатированный для экрана:

awk 'BEGIN { FS="," ; OFS=" " }
         NR>1 && NF { league[$1][$4]++ }
         END { for ( team in league )
               for ( results in league[team] )
               print league[team][results],results,team }' teams.csv

Выход:

1 Win Knicks
1 Loss Knicks
1 Win Lakers
2 Loss Lakers
1 Win Celtics

Добавьте | sort -t " " -k 3 -k 2,2в конец этого кода, чтобы отсортировать по командам, а затем по результатам для каждой команды.

Отсортированный вывод:

1 Win Celtics
1 Loss Knicks
1 Win Knicks
2 Loss Lakers
1 Win Lakers
4
27.01.2020, 21:50

Все, что вам нужно сделать, это отсортировать файл и передать его uniq -cдля подсчета уникальных вхождений:

sort teams.csv | uniq -c

Это должно привести к такому результату:

      1 Celtics,Win
      1 Knicks,Loss
      1 Knicks,Win
      2 Lakers,Loss
2
27.01.2020, 21:50

С помощью GNU datamash (и awk для изменения порядка столбцов, если это важно для вас):

$ datamash -W --header-in groupby 1,4 count 4 < teams.csv | awk '{print $3, $2, $1}'
1 Loss Knicks
1 Win Celtics
2 Loss Lakers
1 Win Knicks
1 Win Lakers

Обратите внимание, что, поскольку мы не просим сортировать datamash, группируются только те результаты, которые уже находятся рядом.

Если ваши данные действительно разделены запятой , замените-Wна-t,

2
27.01.2020, 21:50

Вы можете просто использовать sortи затем передать его в uniq -c, но это будет включать Team, Result.

Во избежание этого:

$ awk 'NR>1 {print $4,$1}' team.csv | sort -k2 | uniq -c

Чтобы объяснить каждый раздел:

  • awk 'NR>1 {print $4,$1}'-Печатает все строки больше первой с результатом, за которым следует команда, как указано в столбцах 4 и 1 для команды и результата.
  • sort -k2-Сортировка по команде, так как она становится вторым столбцом после работы awk.
  • uniq -c-Подсчитывает количество уникальных вхождений

Вывод отсортирован по командам:

1 Win Celtics
1 Loss Knicks
1 Win Knicks
2 Loss Lakers
1 Win Lakers
1
27.01.2020, 21:50

Теги

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