Champs de référencement croisé Gawk et insertion de valeur
Je souhaite développer ce script de référencement croisé, toute aide serait grandement appréciée.
Script actuel>
gawk -F"\t" '
FNR==NR{a[$1][$2]=1;next}
$2 in a{for(i in a[$2]) print $1 FS i}
' a.txt b.txt
Exemple de a.txt:
[email protected] hello example
[email protected] hello world
Exemple de b.txt:
Charles [email protected]
Erica [email protected]
Sortie>
Charles hello example
Charles hello world
Erica hello example
Erica hello world
Fondamentalement, ce script vérifie si $1in a.txtest égal à $2in b.txtet si c'est le cas, sortez $2à a.txtcôté de $1in b.txt(comme vu ci-dessus)
Je souhaite utiliser un format différent et éditer b.txtdirectement, exemple de résultat souhaité>
a.txt restera le même que ci-dessus.
Exemple de b.txt:
Charles [email protected] 0 msg example
Erica [email protected] 0 msg example
a donc maintenant b.txt5 colonnes, nous allons faire correspondre $2de b.txtà $1de a.txt comme avant, mais insérer $2de a.txt dans $4b.txt en remplaçant la valeur actuelle par la nouvelle le cas échéant.
Je veux aussi des ignore-casematchs, mais je suppose que je peux juste terminer $1,$2,etcavec tolower()?
Sortie souhaitée>
Charles [email protected] 0 hello example example
Erica [email protected] 0 hello example example
Réponses
Modifier un peu votre script d'origine,
awk '
BEGIN{FS=OFS="\t"}
#Parsing first file
FNR==NR{a[tolower($1)]=$2;next}
#Parsing second file
{
i=tolower($2) if(i in a){$4=a[i];print}
}
' a.txt b.txt > c.txt &&
mv c.txt b.txt
tolowerest utilisé pour faire correspondre le 1er champ de a.txtavec le 2ème de sans tenir compte de la b.txtcasse.
La sortie est stockée dans un fichier temporaire c.txt, qui écrase ensuite le b.txtsi la awksortie a réussi.
awk '
BEGIN { FS=OFS="\t" }
{ split(tolower($0),lc) } NR==FNR { a[lc[1]] = $2
next
}
lc[2] in a {
$4 = a[lc[2]]
print
}
' a.txt b.txt