web-dev-qa-db-fra.com

Comment puis-je réduire l'espace blanc d'une variable dans awk?

Supposons que $ 2 soit ma variable. J'ai essayé de partir de

awk -F\, '{print $2 ":"}'

à 

awk -F\, '{print gsub(/[ \t]+$/, "", $2) ":"}'

Mais cela va d’imprimer quelque chose à rien du tout.

24
Hoa

Vous imprimez le résultat de gsub, mais gsub effectue une modification sur place de $2 au lieu de renvoyer une copie modifiée. Appelez gsub, puis imprimez:

awk -F\, '{gsub(/[ \t]+$/, "", $2); print $2 ":"}'
44
je4d

Ces fonctions sont pratiques pour améliorer la lisibilité. Ils renvoient également le résultat coupé:

function ltrim(s) { sub(/^[ \t\r\n]+/, "", s); return s }
function rtrim(s) { sub(/[ \t\r\n]+$/, "", s); return s }
function trim(s) { return rtrim(ltrim(s)); }
BEGIN {
# whatever
}
{
# whatever
}
END {
# whatever
} 

Source: https://Gist.github.com/andrewrcollins/1592991

29
Jong Bor Lee

(Je n'ai pas assez de points pour commenter directement la réponse précédente.)

Pour réduire les espaces au fin de $2, utilisez:

awk -F\, '{gsub(/[ \t]+$/, "", $2); print $2 ":"}'

Pour couper les espaces au début de $2, utilisez:

awk -F\, '{gsub(/^[ \t]+/, "", $2); print $2 ":"}'

Et pour les deux fin et début:

awk -F\, '{gsub(/^[ \t]+/, "", $2); gsub(/[ \t]+$/, "", $2); print $2 ":"}'
16
JGC

Une ligne pour gawk:

gawk -F\, '{$2 = gensub(/^[ \t]*|[ \t]*$/,"","g",$2)}'
3
Ben

Une option plus simple:

Vous devez définir la fonction trim, l’utilisation gsub pour un remplacement général. Puis trouver avec une expression régulière si commence ou se termine par un espace (une ou plusieurs fois), renvoie le champ. 

   awk -F'|' 'function trim(field){
   gsub(/^ +| +$/,"", field); 
   return field
   }{
   OFS=",";
   print trim($2),trim($3)}' stations > lista.csv

Avec ce code est enougth

Et le fichier stations est avec cette structure:

     1 | UTAR | U de Tarapacá                   
     3 | VALN | Valparaíso                      
     4 | JRGN | Junta Gorgino                   
     6 | TRPD | Torpederas