Je veux écrire un shell script
qui obtiennent deux fichiers A
et B
, et obtenir un résultat comme celui - ci:
Fichier A
:
user_a tel_a addr_a
user_b tel_b addr_b
Fichier B
:
process_1 user_a
process_2 user_a
process_3 user_b
Et le résultat:
user_a process_1 tel_a addr_a
user_a process_2 tel_a addr_a
user_b process_3 tel_b addr_b
Comment puis-je faire ceci? awk
ou autre chose?
text-processing
awk
join
Navid Farhadi
la source
la source
cut
etpaste
seulement, mais je ne comprends pas bien le synthax.cut
etpaste
regardez leur page de manuel.Réponses:
join
...Production
Les fichiers d'entrée doivent être triés par le champ clé ... Vos fichiers d'exemple sont déjà triés, donc ce n'était pas nécessaire, mais sinon vous pourriez incorporer le tri comme suit.
la source
man join
dans la ligne de commande du terminal ...-1 2 -2 1
signifie: joindre sur le '1er fichier 2e champ' et le ' 2nd-file 1st-field 'Depuis
join
etpaste
ne sont pas disponibles partout (ils ne sont pas sur mon système basé sur BusyBox, par exemple), voici comment le faire avec awk, comme demandé:la source
A[$1]=$2 OFS $3
... Voici une autre variante qui évite la boucle manuelle dans BEGIN, mais c'est à peu près la même chose (à awk ), bien qu'elle introduise un test de condition autrement inutile pour le deuxième fichier:awk 'NR==FNR {A[$1]=$2 OFS $3;next} {print $2, $1, A[$2]}' fileA fileB
... (+ 1)