Comment puis-je l'utiliser awk
dans la situation suivante?
Je veux concaténer des lignes commençant par la même colonne. Seule la première colonne est maintenue après la jointure (dans ce cas aaa
, www
, hhh
).
Le fichier peut être séparé par des espaces ou des tabulations.
Exemple d'entrée:
aaa bbb ccc ddd NULL NULL NULL
aaa NULL NULL NULL NULL NULL NULL
aaa bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy
hhh 111 333 yyy ooo hyy NULL
Sortie désirée:
aaa bbb ccc ddd NULL NULL NULL NULL NULL NULL NULL NULL NULL bbb ccc NULL NULL NULL NULL
www yyy hhh NULL NULL NULL NULL
hhh 111 333 yyy ooo hyy uuuioooy 111 333 yyy ooo hyy NULL
Le fond à cela est que je veux mettre en place une base de données basée sur des fichiers très simple, où la première colonne est toujours l'identifiant de l'entité. Toutes les lignes basées sur la même colonne d'identifiant sont concaténées.
text-processing
sed
awk
minuscule
la source
la source
uuu
vient la ligne (dans la sortie)?Réponses:
Pour obtenir les premières colonnes de chaque ligne à l'aide de awk, vous pouvez procéder comme suit:
Ce sont vos clés pour le reste des lignes. Vous pouvez donc créer une table de hachage, en utilisant la première colonne comme clé et la deuxième colonne de la ligne comme valeur:
Pour obtenir le reste de la ligne, en commençant par la colonne 2, vous devez collecter toutes les colonnes:
la source
Quelqu'un d'autre peut répondre en awk ou sed, mais une version Python est simple et peut vous être utile.
la source
Il s'agit plus d'une application intéressante de coreutils, je soupçonne que ce n'est pas très efficace avec une grande entrée car elle appelle join pour chaque ligne de l'entrée.
Pour améliorer son efficacité,
outfile
iltmp
peut être utile d' enregistrer et sur un disque virtuel.Éditer
Ou sans fichiers temporaires:
la source
Et voici une doublure PERL:
la source