Comment obtenir la deuxième colonne à partir de la sortie de la commande?

Le résultat de ma commande est quelque chose comme:

 N O D E O U T P U T THE FOLLOWING TABLE IS PRINTED FOR NODES BELONGING TO NODE SET NSET_OUTPUT NODE FOOT- NT11 NOTE 3 20.00 11 20.00 1003 23.75 1011 23.75 2003 27.52 2011 27.52 3003 31.30 3011 31.30 4003 35.08 4011 35.08 5003 38.87 5011 38.87 6003 42.67 6011 42.67 7003 46.48 7011 46.48 8003 50.29 8011 50.29 9003 54.12 9011 54.12 10003 57.95 10011 57.95 11003 61.79 11011 61.79 12003 65.64 12011 65.64 13003 69.50 13011 69.50 14003 73.37 14011 73.37 15003 77.25 15011 77.25 16003 81.14 

La première colonne est toujours un nombre, Mon but est dobtenir la deuxième colonne uniquement, comme:

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 . . 

Javais lintention dutiliser

# gawk -f nset_output.awk electric_thermal.dat BEGIN{ } { if($12~/NSET_OUTPUT/ ){ for(i=1;i <= 5; i++){ getline } x=$2 print x >"nset_output.dat" } } 

pour accomplir ceci.Mais, la sortie est foirée: (une seule valeur 20,00) 20,00

Alors, comment puis-je obtenir la valeur de la deuxième colonne? (dans mon cas, jai 405 lignes correspondant à 405 valeurs avec 1 colonne)

Commentaires

  • Si len-tête est de longueur fixe, vous pouvez le supprimer avec seulement tail, puis awk pour lautre colonne. Je ' suggère de faire attention à lindentation du code, lextrait de code de la question est assez difficile à interpréter car lindentation et les accolades ne correspondent pas.

Réponse

En supposant que cela suffit pour vérifier un chiffre dans la première colonne:

awk "$1 ~ /[0-9]/ { print $2 }" data.in >data.out 

Pour vous assurer que cela nest appliqué quaux lignes après la ligne NSET_OUTPUT, vous pouvez faire quelque chose comme ceci:

sed "1,/NSET_OUTPUT/d" data.in | awk "$1 ~ /[0-9]/ { print $2 }" >data.out 

Cela supprimera les lignes avant NSET_OUTPUT et enverra le reste au script awk.


Votre script ne produira quun seul nombre car il, pour chaque ligne dentrée , recherchera NSET_OUTPUT, et sil est trouvé, ignorez cinq lignes avant de récupérer le nombre de la deuxième colonne.

Voici une version fixe de votre script:

BEGIN { print_values = 0 } $12 ~ /NSET_OUTPUT/ { for (i = 1; i <= 5; i++) { getline; } print_values = 1; } print_values == 1 { x = $2; print x >"nset_output.dat" } 

Commentaires

  • À garder à lesprit que la sortie de la commande a un en-tête (voir la révision de la question) qui peut contenir des éléments comme 3G votre regex doit être plus stricte pour filtrer ces valeurs
  • @sjsam Non tout à fait je le vois moi-même (en parcourant les révisions), mais jai ' mis à jour la réponse néanmoins (dune manière qui la rend différente de la vôtre et Stephen ' s).

Réponse

Nous pouvons tester pour voir si le premier champ commence par un nombre et imprimer simplement le second

awk "$1 ~ /^[0-9][0-9]*$/ { print $2}" electric_thermal.dat > nset_output.dat 

Cela correspond à votre fichier source et renvoie

20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 .... 

Commentaires

  • Pourquoi pas [0-9]+ coz first column is always a number? Il est également clair que lentrée provient dune commande, elle doit donc être redirigée
  • Toutes les versions de awk ne prennent pas en charge le + syntaxe. La question disait que les données provenaient de electric_thermal.dat
  • Hmm ,,, Jai oublié le commentaire dans le script. Merci. Concernant + je nai jamais eu de problème avec eux avec gnu/non-gnu awks De quelle version parlez-vous?
  • Anciens systèmes 🙂

Réponse

awk est votre ami:

awk "$1 ~ /^[[:digit:]]+$/{print $2}" electric_thermal.dat >outfile 

devrait le faire

Réponse

Commande

 awk "$1 ~ /^[0-9]*$/{print $2}" file name output 20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 35.08 35.08 38.87 38.87 42.67 42.67 46.48 46.48 50.29 50.29 54.12 54.12 57.95 57.95 61.79 61.79 65.64 65.64 69.50 69.50 73.37 73.37 77.25 77.25 81.14 

Réponse

Si les 7 lignes ci-dessus persistent après lexécution de la commande à chaque fois, utilisez:

yourcommand | sed 1,7d | awk "{print $2}" 

sed 1,7d masquera simplement les 7 premières lignes, dont vous navez pas besoin . awk triera le contenu exact que vous recherchez réellement …

cat yourcommand_out | sed 1,7d | awk "{print $2}" 20.00 20.00 23.75 23.75 27.52 27.52 31.30 31.30 35.08 35.08 38.87 38.87 42.67 42.67 46.48 46.48 50.29 50.29 54.12 54.12 57.95 57.95 61.79 61.79 65.64 65.64 69.50 69.50 73.37 73.37 77.25 77.25 81.14 

Commentaires

  • Downvote: Inutile [ utilisation du chat ] , et la solution ne satisfait ' y les exigences. Veuillez également formater le code.

Réponse

Essayez ceci:

awk "/^[ ]*[[:digit:]]/ {print $2}" inputFile 

Commentaires

  • Veuillez apprendre à utiliser les blocs de code.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *