Я надеюсь возвращать строки в csv, которые уникальны для указанного подмножества столбцов.
Данные в качестве примера:
Col1,Col2,Col3,Col4
A,10,50,2017
A,10,05,2017
B,20,30,2017
B,20,03,2017
C,30,100,2017
C,30,111,2017
C,30,100,2016
C,40,111,2016
C,30,123,2015
Эта команда производит уникальные значения отдельного столбца (столбец 1 в этом случае):
awk -F , '{ a[$1]++ } END { for (b in a) { print b } }' file
возвраты
Col1
A
B
C
Я хотел бы, чтобы команда сделала это для 2 столбцов или n столбцов.
Желаемый вывод для уникального использования строк 2 столбца (Col1 и Col3):
Col1,Col3
A,50
A,05
B,30
B,03
C,100
C,111
C,123
Для Col1 и Col4
Col1,Col4
A,2017
B,2017
C,2017
C,2016
C,2015
Для 3 столбцов Col1, Col2 и Col3
Col1,Col2,Col3
A,10,50
A,10,05
B,20,30
B,20,03
C,30,100
C,30,111
C,40,111
C,30,123
Для печати определенного столбца, скажем, столбца 1 и 4, просто работайте:
awk -F',' '{print $1, $4}' file
команда здесь должна попросить awk
печатать обозначенный столбец, разделенный'',
можно изменить номер столбца, добавить / удаляют $NUM для получения различных столбцов.
Объединенный с sort
, Вы получите уникальные строки:
awk -F',' '{print $1, $4}' file | sort -u
Эти -u
флаг удаляет дублирующиеся объекты из вывода.
Можно сделать это путем объединения значений столбцов в ключе хеша, например, предположения, что вход отсортирован, работы решения этой-передачи для столбца 1-3:
awk '!h[$1,$2,$3]++ { NF--; print }' FS=, OFS=, data.csv
Вывод:
Col1,Col2,Col3
A,10,50
A,10,05
B,20,30
B,20,03
C,30,100
C,30,111
C,40,111
C,30,123
столбцы 1 и 4 For, сделайте что-то вроде этого:
awk '!h[$1,$4]++ { print $1, $4 }' FS=, OFS=, data.csv
Вывод:
Col1,Col4
A,2017
B,2017
C,2017
C,2016
C,2015
#!/usr/bin/env python
import sys
filename = sys.argv[1]
col_nums = sys.argv[2:]
if not col_nums:
sys.exit()
rows_unique = []
for row in open(filename).read().splitlines():
cells = row.split(',')
# Select cells in row based on given column numbers.
cells_selected = [cells[int(col_num)] for col_num in col_nums]
row_selected = ','.join(cells_selected)
if row_selected not in rows_unique:
print(row_selected)
rows_unique += [ row_selected ]
Сохраните как исполняемый сценарий, затем звоните (обратите внимание, что столбцы индексируются нулем):
$ get_unique_rows_per_column.py file 0 2
Col1,Col3
A,50
A,05
B,30
B,03
C,100
C,111
C,123