web-dev-qa-db-fra.com

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

La sortie de ma commande est quelque chose comme:

1540 "A B"
   6 "C"
 119 "D"

La première colonne est toujours un nombre, suivi d'un espace, puis d'une chaîne entre guillemets.

Mon but est d’obtenir la deuxième colonne seulement, comme:

"A B"
"C"
"D"

J'avais l'intention d'utiliser <some_command> | awk '{print $2}' pour accomplir cela. Mais la question est de savoir si certaines valeurs de la deuxième colonne contiennent des espaces, qui se trouvent être le délimiteur par défaut de awk pour séparer les champs. Par conséquent, la sortie est foirée:

"A
"C"
"D"

Comment puis-je obtenir la valeur de la deuxième colonne (avec des citations appariées) proprement?

126
Qiang Xu

Ou utilisez sed & regex.

<some_command> | sed 's/^.* \(".*"$\)/\1/'
28
catay

Utilisez -F [field separator] pour fractionner les lignes sur "s:

awk -F '"' '{print $2}' your_input_file

ou pour l'entrée du tuyau

<some_command> | awk -F '"' '{print $2}'

sortie:

A B
C
D
167
Alex

Si vous pouviez utiliser autre chose que 'awk', essayez plutôt ceci

echo '1540 "A B"' | cut -d' ' -f2-

- d est un délimiteur, - f est le champ à couper et avec - f2 - nous avons l'intention de couper le 2e champ jusqu'à la fin.

74
TheAshwaniK

Cela devrait fonctionner pour extraire une colonne spécifique de la sortie de la commande "images du menu fixe":

REPOSITORY                          TAG                 IMAGE ID            CREATED             SIZE
ubuntu                              16.04               12543ced0f6f        10 months ago       122 MB
ubuntu                              latest              12543ced0f6f        10 months ago       122 MB
Selenium/standalone-firefox-debug   2.53.0              9f3bab6e046f        12 months ago       613 MB
Selenium/node-firefox-debug         2.53.0              d82f2ab74db7        12 months ago       613 MB


docker images | awk '{print $3}'

IMAGE
12543ced0f6f
12543ced0f6f
9f3bab6e046f
d82f2ab74db7

Cela va imprimer la troisième colonne

32
hemanto

Vous n'avez pas besoin de awk pour ça. Utiliser read dans Bash Shell devrait suffire, par exemple.

some_command | while read c1 c2; do echo $c2; done

ou:

while read c1 c2; do echo $c2; done < in.txt
15
kenorb

Si vous avez GNU awk, voici la solution que vous souhaitez:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
10
Chris Seymour
#!/usr/bin/python
import sys 

col = int(sys.argv[1]) - 1

for line in sys.stdin:
    columns = line.split()

    try:
        print(columns[col])
    except IndexError:
        # ignore
        pass

Ensuite, en supposant que vous nommez le script par co, disons, faites quelque chose comme ceci pour obtenir la taille des fichiers (l'exemple suppose que vous utilisez Linux, mais le script lui-même est indépendant du système d'exploitation): -

ls -lh | co 5

0
Andy Southwell
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file
0
Vijay