web-dev-qa-db-fra.com

Comment puis-je utiliser `awk` pour scinder le texte en colonne?

Comment puis-je extraire la première colonne (la première colonne de "")

"xxxxx1" {685a}
"xx2" {bcdd}
"xx3 gsdd" {29a6ff}
"sdsdf xxx" {243b9}
"sdfsdf ccc dd" {c28f2f}
"dsdsf sfsdf" {216e}
"sdfsdfsd" {48530}
"sdfsdff" {9d2afa0n}
"sdfsdfdff sdfs" {d8681a}
"sdfsdsds sdfsdf d" {5b9b8}
"sdfsdfs sdf sdfsdf" {68e08a}
"sdfsdfsdf sdf" {107fa0}

voici ce que je veux avoir comme résultat:

"xxxxx1"
"xx2"
"xx3 gsdd"
"sdsdf xxx"
"sdfsdf ccc dd"
"dsdsf sfsdf"
"sdfsdfsd"
"sdfsdff"
"sdfsdfdff sdfs"
"sdfsdsds sdfsdf d"
"sdfsdfs sdf sdfsdf"
"sdfsdfsdf sdf"

une idée?

5
dmx

Utilisez ​ { (espace, accolade) comme délimiteur de champ, car le deuxième champ ne vous intéresse pas:

$ awk -F ' {' '{print $1}' foo
"xxxxx1"
"xx2"
"xx3 gsdd"
"sdsdf xxx"
"sdfsdf ccc dd"
"dsdsf sfsdf"
"sdfsdfsd"
"sdfsdff"
"sdfsdfdff sdfs"
"sdfsdsds sdfsdf d"
"sdfsdfs sdf sdfsdf"
"sdfsdfsdf sdf"
11
muru

Si vous voulez juste tout ce qui se trouve entre le premier et le dernier caractère " à guillemets doubles de chaque ligne, la solution la plus simple serait probablement la suivante, en utilisant grep au lieu de awk:

grep -o '".*"' FILENAME

Le commutateur -o permet à grep de ne produire que les parties correspondantes à la place de la ligne entière contenant la correspondance. Le modèle ".*" (guillemet simple, pour empêcher l'interprétation du shell) correspond à une séquence de n'importe quel caractère (.) de longueur quelconque (*), y compris zéro, entourée de guillemets.

3
Byte Commander

Au lieu de la solution muru awk.

en utilisant cut:

cut -f 1 -d { < file.txt

en utilisant grep:

grep -o '".*"' file.txt

ou

grep -o \".*\" file.txt

en utilisant sed:

sed -r 's/(".*").*/\1/' file.txt

ou

sed -r 's/\{.*\}//' file.txt

ou même:

sed 's/{.*//'
2
Ravexina

Perl avec le groupement (.*) peut aussi le faire:

$ Perl -pe 's/"(.*)".*/"\1"/g' input.txt                                                    
"xxxxx1"
"xx2"
"xx3 gsdd"
"sdsdf xxx"
"sdfsdf ccc dd"
"dsdsf sfsdf"
"sdfsdfsd"
"sdfsdff"
"sdfsdfdff sdfs"
"sdfsdsds sdfsdf d"
"sdfsdfs sdf sdfsdf"
"sdfsdfsdf sdf"

L'astuce ici est de faire correspondre la ligne entière et d'utiliser "(.*)" pour traiter tout ce qui se trouve entre les guillemets comme un seul groupe. Nous remplaçons toute cette ligne par le groupe que nous avons mis en correspondance en y faisant référence via \1.

1