Je cherche à renvoyer dans un CSV des lignes uniques pour un sous-ensemble spécifié de colonnes.
Exemple de données:
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
Cette commande génère les valeurs uniques d'une seule colonne (la colonne 1 dans ce cas):
awk -F , '{ a[$1]++ } END { for (b in a) { print b } }' file
résultats
Col1
A
B
C
Je voudrais une commande pour faire ceci pour 2 colonnes ou n colonnes.
Sortie souhaitée pour des lignes uniques utilisant 2 colonnes (Col1 et Col3):
Col1,Col3
A,50
A,05
B,30
B,03
C,100
C,111
C,123
Pour Col1 et Col4
Col1,Col4
A,2017
B,2017
C,2017
C,2016
C,2015
Pour 3 colonnes Col1, Col2 et 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
Pour imprimer une certaine colonne, disons les colonnes 1 et 4, exécutez simplement:
awk -F',' '{print $1, $4}' file
La commande ici est de demander à awk
d’imprimer la colonne désignée séparée par le caractère ','
Vous pouvez changer le numéro de colonne, ajouter/supprimer le $ NUM pour obtenir différentes colonnes.
En combinaison avec sort
, vous obtiendrez les lignes uniques suivantes:
awk -F',' '{print $1, $4}' file | sort -u
L'indicateur -u
supprime les éléments en double de la sortie.
Vous pouvez le faire en combinant les valeurs de colonne dans la clé de hachage, par exemple. en supposant que votre entrée soit triée, cette solution en une passe fonctionne pour la colonne 1-3:
awk '!h[$1,$2,$3]++ { NF--; print }' FS=, OFS=, data.csv
Sortie:
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
Pour les colonnes 1 et 4, procédez comme suit:
awk '!h[$1,$4]++ { print $1, $4 }' FS=, OFS=, data.csv
Sortie:
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 ]
Enregistrez en tant que script exécutable, puis appelez (notez que les colonnes sont indexées à zéro):
$ 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