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?
Ou utilisez sed & regex.
<some_command> | sed 's/^.* \(".*"$\)/\1/'
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
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.
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
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
Si vous avez GNU awk, voici la solution que vous souhaitez:
$ awk '{print $1}' FPAT='"[^"]+"' file
"A B"
"C"
"D"
#!/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
awk -F"|" '{gsub(/\"/,"|");print "\""$2"\""}' your_file