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

152

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 uniquement, comme:

"A B"
"C"
"D"

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

"A
"C"
"D"

Comment obtenir proprement la valeur de la deuxième colonne (avec des guillemets appariés)?

Qiang Xu
la source
1
J'ai essayé d'utiliser awk '{$1=""; print $0}', mais il a toujours un caractère d'espace blanc principal. Il pourrait être supprimé par sed '/^ //'. Pourtant, cela pourrait-il être fait avec awk?
Qiang Xu

Réponses:

29

Ou utilisez sed & regex.

<some_command> | sed 's/^.* \(".*"$\)/\1/'
Catay
la source
Cmd plus court car vous n'avez pas besoin de marqueurs de début et de fin:<some_command> | sed 's/.* \(".*"\)/\1/'
Timo
197

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

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

ou pour l'entrée du tuyau

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

production:

A B
C
D
Alex
la source
3
C'est bien, mais je veux aussi les citations originales environnantes. Cela pourrait-il être fait? Merci.
Qiang Xu
5
vous pourriez tricher, et changer l'impression de awk en'{print "\""$2"\""}'
Alex
Ouais, ça marche. Merci beaucoup, Alex! Au fait, tant de citations, :)
Qiang Xu
@Alex, pourriez-vous expliquer comment vous avez utilisé les guillemets doubles et la barre oblique inverse pour obtenir ce que l'op voulait.
Timo
1
@Timo La répartition des guillemets et des barres obliques inverses peut être envisagée comme "\"" + $2 + "\"". Les guillemets environnants indiquent quelque chose à ajouter à la sortie et le guillemet échappé ( \") est en cours d'impression. Pour aider le visualiser, voici ce qu'elle ressemblerait si nous voulions ajouter des espaces vides autour de la $2place des guillemets: '{print " "$2" "}'. Nous pouvons également ajouter un espacement de format pour le rendre un peu plus facile à grok:'{print " " $2 " "}'
Tom
80

Si vous pouvez utiliser autre chose que 'awk', essayez ceci à la place

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 2ème champ jusqu'à la fin.

TheAshwaniK
la source
cela m'a aidé à essayer de faire ce qui suit (récupérer l'ID de validation d'un fichier dans git): git annotate myfile.cpp | grep '2016-07' | tête -1 | cut -f1
serup
2
C'est bien, mais ne fonctionne pas si le délimiteur comporte plus d'un caractère. C'est là que la solution awk est utile
smac89
2
Pourquoi un espace n'est-il pas utilisé après -d? Cela semble un peu étrange de cette façon.
Chris Stryczynski
43

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

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

Hemanto
la source
Avez-vous vu des images de docker | awk '{print $ 5}'?
Shashi Ranjan
17

Vous n'avez pas besoin de awk pour cela. L'utilisation readdans le shell Bash 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
Kenorb
la source
13

Si vous avez GNU awk, c'est la solution que vous souhaitez:

$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
Chris Seymour
la source
0
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file
Vijay
la source
0
#!/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 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

Andy Southwell
la source