1
votes

réorganiser d'une chaîne spécifique dans la colonne respective

J'essaie de réorganiser une chaîne spécifique dans la colonne respective. etc:

cat input.txt | sed '/^\s*$/d'  | awk 'BEGIN{RS=","};match($0,/N/){print $3"c"$2}' | sed ':a;N;$!ba;s/\n/;/g' | sed 's/W//g;s/N//g;s/S//g' 

Résultat:

W=Weak
490 @ 5
553 @ 6

A=Absolute
565 @ 6

N=Normal
126 @ 1
18 @ 3
559 @ 4
562 @ 4
564 @ 4
553 @ 6
564 @ 9

Voici l'entrée

(N=Normal, W=Weak)
Value 1
126N,
Value 3
18N,
Value 4
559N, 562N, 564N,
Value 6
553W, 565A, 553N,
Value 5
490W,
Value 9
564N,

Et le résultat devrait être

N=Normal
126 @ 1

Faites-moi savoir ce que vous en pensez.

J'ai essayé ce script, je suis toujours en train de concaténer le valeur

126N (will be sorted into "Normal" column)
Value 1 (the integer will be concatenated with 126)

Et certains d'entre eux manquent

awk

5 commentaires

Pourquoi ne vois-je pas 18 @ 3 en Normal? Vous avez 564 @ 9 .


Pouvez-vous également avoir une ligne comme celle-ci 231W, 141N, 553N ?


Ouais, une partie


Ensuite, vous devez également mettre à jour votre question avec ce type d'exemple.


d'accord, mis à jour


3 Réponses :


2
votes

Cela devrait vous donner ce que vous voulez en utilisant gnu awk
Il fonctionnera avec n'importe quel nombre de lettres, pas seulement A N W

awk -F, '
!/Value/ {
    for (i=1;i<NF;i++) {
        hd=substr($i,length($i),1);
        arr[hd][++cnt[hd]]=($i+0" @ "f)}
    }
    {split($0,b," ");f=b[2];} 

END {  
    for (i in arr)  { print "\n"i"\n---";
        for (j in arr[i]) {
            print  arr[i][j]}}
}' file


A
---
565 @ 6

N
---
562 @ 4
564 @ 4
553 @ 6
564 @ 9
126 @ 1
18 @ 3
559 @ 4

W
---
553 @ 6
490 @ 5


5 commentaires

Merci beaucoup, ça devrait aller, c'est vraiment utile. Passe une bonne journée


@ user10254032 Vous êtes les bienvenus. Raccourcissez-en certains en supprimant le bloc BEGIN inutile.


@ user10254032 Une grosse erreur a été trouvée, utilisait le même tableau deux fois. Résultat maintenant corrigé et correct :)


@ user10254032 a été corrigé pour qu'il fonctionne avec n'importe quelle combinaison de chiffres / lettres.


Merci pour vos efforts, cela m'aide vraiment, Jotne



1
votes

Une autre alternative dans awk serait:

$ awk -F',| ' '
>     $1 == "Value" {value = $2; next}
>     { for (i=1; i<=NF; i++) {
>         if ($i~"N$")
>             N[substr($i, 1, length($i) - 1)] = value
>         if ($i~"W$")
>             W[substr($i, 1, length($i) - 1)] = value
>       }
>     }
>     END {
>         print "W=Weak"
>         for (i in W)
>             print i, "@", W[i]
>         print "\nN=Normal"
>         for (i in N)
>             print i, "@", N[i]
>     }
> ' file
W=Weak
490 @ 5

N=Normal
18 @ 3
126 @ 1
559 @ 4
562 @ 4
564 @ 9

( remarque: cela repose sur la connaissance que les en-têtes voulus sont W = Faible et N = Normal . Si cela prendrait quelques expressions supplémentaires si les en-têtes sont susceptibles de changer.)

Sortie

awk -F',| ' '
    $1 == "Value" {value = $2; next} 
    { for (i=1; i<=NF; i++) {
        if ($i~"N$")
            N[substr($i, 1, length($i) - 1)] = value
        if ($i~"W$") 
            W[substr($i, 1, length($i) - 1)] = value
      }
    }
    END {
        print "W=Weak"
        for (i in W)
            print i, "@", W[i]
        print "\nN=Normal"
        for (i in N)
            print i, "@", N[i]
    }
' file


0 commentaires

1
votes
$ awk -f tst.awk file
W=Weak
553 @ 6
490 @ 5

A=Absolute
565 @ 6

N=Normal
126 @ 1
18 @ 3
559 @ 4
562 @ 4
564 @ 4
553 @ 6
564 @ 9

0 commentaires