awk determina linhas únicas com base no subconjunto de colunas

3

Eu estou olhando para retornar linhas em um csv que são exclusivas para um subconjunto especificado de colunas.

Exemplo de dados:

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

Este comando gera os valores únicos de uma única coluna (coluna 1, neste caso):

awk -F , '{ a[]++ } END { for (b in a) { print b } }' file

retorna

Col1
A
B
C

Eu gostaria de um comando para fazer isso por 2 colunas ou n colunas.

Saída desejada para linhas exclusivas usando 2 colunas (Col1 e Col3):

Col1,Col3
A,50
A,05
B,30
B,03
C,100
C,111
C,123

Para Col1 e Col4

Col1,Col4
A,2017
B,2017
C,2017
C,2016
C,2015

Por 3 colunas Col1, Col2 e 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
    
por conor 19.05.2017 / 06:13

3 respostas

1

Para imprimir uma determinada coluna, digamos as colunas 1 e 4, basta executar:

awk -F',' '{print , }' file

O comando aqui é pedir a awk para imprimir a coluna designada separada por ','

Você pode alterar o número da coluna, adicionar / remover o $ NUM para obter colunas diferentes.

Combinado com sort , você obterá as linhas exclusivas:

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

O sinalizador -u remove itens duplicados da saída.

    
por P.-H. Lin 19.05.2017 / 06:30
2

Você pode fazer isso combinando os valores de coluna na chave de hash, por exemplo, supondo que sua entrada está classificada, essa solução de uma passagem funciona para a coluna 1-3:

awk '!h[,,]++ { NF--; print }' FS=, OFS=, data.csv

Saída:

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

Para as colunas 1 e 4, faça algo assim:

awk '!h[,]++ { print ,  }' FS=, OFS=, data.csv

Saída:

Col1,Col4
A,2017
B,2017
C,2017
C,2016
C,2015
    
por Thor 19.05.2017 / 09:14
0

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 ]

Salve como um script executável e, em seguida, chame (observe que as colunas são indexadas com zero):

$ 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
    
por wjandrea 19.05.2017 / 07:30