Como posso usar 'awk' para dividir o texto na coluna?

6

Como posso extrair a primeira coluna (a primeira coluna em "")

"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}

o que eu quero ter como resultado é isto:

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

alguma ideia?

    
por dmx 18.05.2017 / 20:49

4 respostas

12

Use ​ { (espaço, chave) como delimitador de campo, pois você não se importa com o segundo campo:

$ awk -F ' {' '{print }' foo
"xxxxx1"
"xx2"
"xx3 gsdd"
"sdsdf xxx"
"sdfsdf ccc dd"
"dsdsf sfsdf"
"sdfsdfsd"
"sdfsdff"
"sdfsdfdff sdfs"
"sdfsdsds sdfsdf d"
"sdfsdfs sdf sdfsdf"
"sdfsdfsdf sdf"
    
por muru 18.05.2017 / 20:54
4

Se você quiser apenas tudo entre o primeiro e o último caractere de aspas duplas " de cada linha, a solução mais simples provavelmente seria essa, usando grep em vez de awk :

grep -o '".*"' FILENAME

A opção -o permite que grep imprima apenas as partes correspondentes, em vez da linha inteira que contém a correspondência. O padrão (single-quote, para evitar a interpretação de shell) ".*" corresponde a uma seqüência de qualquer caractere ( . ) com qualquer comprimento ( * ), incluindo zero, que é delimitado por aspas duplas.

    
por Byte Commander 18.05.2017 / 21:19
3

Como alternativa à solução awk do muru.

usando cut :

cut -f 1 -d { < file.txt

usando grep :

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

ou

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

usando sed :

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

ou

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

ou até mesmo:

sed 's/{.*//'
    
por Ravexina 18.05.2017 / 21:21
2

Perl com o agrupamento (.*) também pode:

$ perl -pe 's/"(.*)".*/""/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"

O truque aqui é que combinamos linha inteira e usamos "(.*)" para tratar tudo entre aspas duplas como um grupo. Substituímos toda a linha com o grupo que correspondemos consultando part.

    
por Sergiy Kolodyazhnyy 18.05.2017 / 21:56