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
3 Réponses :
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
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
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
$ 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
Pourquoi ne vois-je pas
18 @ 3
en Normal? Vous avez564 @ 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