Adicionando intervalos entre cada duas palavras no bash

2

Minha consulta é:

QUERY="SELECT 'Your Name:', FullName, 'Your Phone:', Phone, 'Email:', Email FROM Table1 JOIN  WHERE EmpID=001;"

A saída que recebo é:

Your Name: Samanta Your Phone: 111-111-1111 Email: [email protected]

Mas eu quero essa saída quando imprimo:

Your Name: Samanta
Your Phone: 111-111-1111
Email: [email protected]

Eu tentei isso:

output = executeSQLQuery "$QUERY" | tr -c ' ' '\n'

Não está funcionando.

    
por user997452 22.09.2012 / 01:02

3 respostas

2

output=executeSQLQuery "$QUERY" |sed 's/: [^ ]* /& \n/g'

O comando acima gera

user@user:~> z="Your Name: Samanta Your Phone: 111-111-1111 Email: [email protected]"
user@user:~> echo $z | sed 's/: [^ ]* /& \n/g'
Your Name: Samanta  
Your Phone: 111-111-1111  
Email: [email protected]
user@user:~> 

O comando usou regex correspondente, ou seja, dois-pontos (':') seguido por um espaço e todos os caracteres não espaciais. No entanto, se os dados contiverem qualquer caractere de espaço, esse comando falhará miseravelmente.

    
por 22.09.2012 / 02:10
2

Isso parece um Problema XY - você diz que quer adicionar um intervalo entre cada duas palavras, mas o que você realmente quer fazer é bonito imprimir os dados retornados por uma consulta SQL.

Seu problema é causado pelo fato de que sua função executeSQLQuery (ou script ou programa) retorna saída formatada em vez de apenas os dados .... e parece que está fazendo isso porque sua cadeia $ QUERY está informando.

Você pode obter executeSQLQuery ou uma função / script relacionado para retornar apenas os dados em um formato facilmente analisado (como CSV ou delimitado por tabulação), sem cabeçalhos de coluna?

(em outras palavras, "Don't Do That, Then". Separe a apresentação dos resultados da coleta de dados)

Se isso for possível, você poderá usar printf para formatar os dados da maneira que quiser. por exemplo. usando saída delimitada por tabulações e uma matriz bash:

QUERY="SELECT FullName, Phone, Email FROM Table1 WHERE EmpID=001;"

# disable globbing which would otherwise be performed upon non-quoted
# command substitution (except in zsh):
set -f

# set the input-field-separator to tab and newline (but not space characters)
# execute the query and store the results in the array $output
IFS=$'\t\n' output=($(executeSQLQuery "$QUERY"))

# now print the output array in the format we want.
printf "Your Name: %s\nYour Phone: %s\nEmail: %s\n" "${output[@]}"

Aqui está um exemplo de trabalho usando o mysql. Eu não sei qual é o seu executeSQLQuery , mas acabei de fazer um banco de dados de teste mysql (chamado 'junk'), preenchai com seus dados de exemplo e defini executeSQLQuery como uma função assim:

$ executeSQLQuery() { mysql --batch --silent junk -e "$@" ;}

Observe as opções --batch e --silent . Eles dizem ao mysql para me fornecer apenas os dados sem cabeçalhos ou outra formatação. Eu não usei as opções -u e -p para usuário e senha porque criei um arquivo ~ / .my.cnf com minhas credenciais.

Agora, vamos executar a consulta, mostrar o que a matriz de saída contém e, em seguida, imprimir com printf.

$ set -f; IFS=$'\t\n' output=($(executeSQLQuery 'Select Fullname,Phone, Email from Table1 where EmpId = 001'))

$ set | grep output
output=([0]="Samantha" [1]="111-111-1111" [2]="[email protected]")

$ printf "Your Name: %s\nYour Phone: %s\nEmail: %s\n" "${output[@]}"
Your Name: Samantha
Your Phone: 111-111-1111
Email: [email protected]

BTW, o bash não suporta matrizes multidimensionais, portanto, se sua consulta retornar várias linhas, você teria que escrever algum tipo de loop para imprimir [0..2], [3..5], [ 6..8] e assim por diante, como registros separados. Por exemplo, adicionei um segundo registro à Tabela 1 e alterei a consulta para retornar todas as linhas ... aqui está como a matriz de saída se parece agora:

$ set -f; IFS=$'\t\n' output=($(executeSQLQuery 'Select Fullname,Phone, Email from Table1'))
$ set | grep output
output=([0]="Samantha" [1]="111-111-1111" [2]="[email protected]" [3]="Fred" [4]="222-222-2222" [5]="[email protected]")

No geral, porém, é muito mais fácil fazer o trabalho de banco de dados em Perl com a biblioteca DBI. Se você não está empenhado em trabalhar no bash por algum motivo, eu recomendo começar a aprender perl.

    
por 22.09.2012 / 04:51
1

O problema com a saída é que você gostaria de agrupar três palavras (embora logicamente par de valores-chave) na primeira linha de saída, outras três nas próximas e últimas duas na terceira linha.

Para este problema em particular, o caminho mais rápido seria:

executeSQLQuery "$QUERY" | awk '{print $1 " " $2 " " $3 "\n" $4 " " $5 " " $6 "\n" $7 " "$8 }'

Mas geralmente seria melhor mudar a consulta para algo como:

SELECT FullName as 'Your name', Phone as 'Your phone', Email FROM Table1 WHERE EmpID=001;

e, em seguida, obtendo a linha junto com os nomes das colunas e criando a saída desejada em perl ou em alguma outra linguagem.

    
por 22.09.2012 / 01:59