Во-первых, вам нужно убедиться, что в конце существующего диска есть не менее 1 МБ свободного места. При необходимости измените размер последнего раздела. Затем просто создайте массив raid из обоих дисков (сначала укажите исходный диск). Обязательно используйте переключатель -e 1.0
на mdadm
, чтобы убедиться, что метаданные рейда помещаются в конец диска. Он автоматически начнет копирование содержимого исходного диска на новый диск. Вам нужно будет сделать все это при загрузке с другого диска или, по крайней мере, со всеми файловыми системами, смонтированными только для чтения. Перезагрузитесь, когда закончите с этим, затем переустановите grub. Если ваш / etc / fstab использует UUID, это все, что вам нужно сделать; в противном случае вам нужно будет убедиться, что он указывает на / dev / mdXpY вместо / dev / sdapY.
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
Все, что вам нужно сделать, это отсортировать файл и передать его uniq -c
для подсчета уникальных вхождений:
sort teams.csv | uniq -c
Это должно привести к такому результату:
1 Celtics,Win
1 Knicks,Loss
1 Knicks,Win
2 Lakers,Loss
С помощью 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,
Вы можете просто использовать 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