awk определяют уникальные строки на основе подмножества столбцов

Я надеюсь возвращать строки в 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
3
задан 19 May 2017 в 10:45

3 ответа

Для печати определенного столбца, скажем, столбца 1 и 4, просто работайте:

awk -F',' '{print $1, $4}' file

команда здесь должна попросить awk печатать обозначенный столбец, разделенный'',

можно изменить номер столбца, добавить / удаляют $NUM для получения различных столбцов.

Объединенный с sort, Вы получите уникальные строки:

awk -F',' '{print $1, $4}' file | sort -u

Эти -u флаг удаляет дублирующиеся объекты из вывода.

1
ответ дан 1 December 2019 в 16:19

Можно сделать это путем объединения значений столбцов в ключе хеша, например, предположения, что вход отсортирован, работы решения этой-передачи для столбца 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
2
ответ дан 1 December 2019 в 16:19

Python

#!/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
0
ответ дан 1 December 2019 в 16:19

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

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