J'ai deux fichiers:

file 1
Name   Height
Jay    180
Kathy  171
Amy    163
Bill   176
Hellen 157

file 2
Name   Height
Jay    195
Amy    173
Hellen 161

Et je veux remplacer la valeur dans la deuxième colonne du fichier 1, si les noms (colonne 1) correspondent dans le fichier 2. Si les noms ne correspondent pas, ils restent inchangés. Le résultat devrait être:

Name   Height
Jay    195
Kathy  171
Amy    173
Bill   176
Hellen 161

Seules la taille de Jay, Amy et Hellen ont changé car leur nom existe dans le fichier 2.

J'ai essayé de résoudre ce problème avec for loop plus awk ou join, mais pas très bien. En fin de compte, j'ai utilisé Excel pour générer une commande LONG awk à partir du fichier 2 et appliqué le fichier ion 1, cela a fonctionné:

awk '{OFS="\t";
if($1~/^Jay$/){$2="195"; print $0;} 
else if($1~/^Amy$/){$2="173"; print $0;} 
else if($1~/^Hellen$/){$2="161"; print $0;} 
}' file 1

De cette façon, j'ai essayé d'utiliser la boucle for pour générer:

else if($1~/^   Amy   $/){$2="   173    ";print $0;}  

Au-dessus, il contient la commande part1 & name & la commande part2 & height pour remplacer & command part3. Mais il est difficile de mettre ces commandes dans une variable car elle contient des caractères spéciaux comme: if, ~, /, $

Je me demande s'il existe un moyen plus simple de le faire uniquement par commande? Merci!

Charlie

0
Charlie 20 nov. 2018 à 19:55

3 réponses

Meilleure réponse

Si l'ordre n'est pas important, cela peut être aussi simple que

$ awk '!a[$1]++' file2 file1

Name   Height
Jay    195
Amy    173
Hellen 161
Kathy  171
Bill   176
1
karakfa 20 nov. 2018 à 17:04

Ce script fera également l'affaire.

#!/bin/bash

while read name height
do
        printed=0
        printf "$name\t"
        while read subname subheight
        do
                [[ $name == $subname ]] && printf "$subheight\n" && printed=1
                continue
        done <<< "$( tail -n +2 secondary.txt)"
        [[ $printed -eq 0 ]] && printf "$height\n"

done <<< "$( tail -n +2 main.txt)"
0
RavinderSingh13 20 nov. 2018 à 17:15

Pourriez-vous s'il vous plaît essayer de suivre.

awk 'FNR==NR{a[$1]=$2;next} {$0=a[$1]?$1 OFS a[$1]:$0} 1'  file2  file1 | column -t

La sortie sera la suivante.

Name    Height
Jay     195
Kathy   171
Amy     173
Bill    176
Hellen  161
0
RavinderSingh13 20 nov. 2018 à 17:03