Champs de référencement croisé Gawk et insertion de valeur

Aug 25 2020

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

2 Quasímodo Aug 25 2020 at 01:19

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.

1 EdMorton Aug 25 2020 at 05:17
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