Eu tenho um arquivo que contém:
Sr. Q
01629699998
Desconhecida Nhung
011287633
...
Eu gostaria de usar isso awk "{print "BEGIN:VCARD";print "Name:"$0;print "TELEPHONE:"$0;print "END:VCARD"}" file
para criar este resultado
INÍCIO: VCARD
Nome: Mr Q
TELEFONE: 01629699998
FIM: VCARD
INÍCIO: VCARD
Nome: Ms Nhung
TELEFONE: 011287633
FIM: VCARD
...
Mas o código acima não entende isso, qualquer um pode me ajudar, obrigado
Respostas:
2 para resposta № 1Experimentar:
$ awk "{if (NR%2) printf "BEGIN:VCARDnName: %sn",$0; else printf "TELEPHONE:%snEND:VCARDn",$0}" inputfile
BEGIN:VCARD
Name: Mr Q
TELEPHONE:01629699998
END:VCARD
BEGIN:VCARD
Name: Ms Nhung
TELEPHONE:011287633
END:VCARD
Como funciona
Seu arquivo de entrada consiste em pares de linhas. A primeira linha tem um nome e a segunda um número de telefone. Assim, queremos fazer algo diferente em linhas numeradas ímpares (nome) e até linhas numeradas (telefone).
if (NR%2)
Isso inicia um
if
declaração com um teste baseado no número de linha módulo 2.printf "BEGIN:VCARDnName: %sn",$0
Este é o comando executado para linhas ímpares.
else printf "TELEPHONE:%snEND:VCARDn",$0
Isso é o que é executado para linhas pares.
0 para resposta № 2
Esta é uma opção pura bash usando printf
:
$ cat list_file # I have added one more entry for explanation.
Mr Q
01629699998
Ms Nhung
011287633
Dr. Drake Ramoray
0123456789
$ OLDIFS="$IFS" # save old IFS
$ IFS=$"n" # Set IFS to newline, because the entries are newline separated.
$ printf "BEGIN:VCARDnName: %snTELEPHONE:%snEND:VCARDn" $(<list_file)
BEGIN:VCARD
Name: Mr Q
TELEPHONE:01629699998
END:VCARD
BEGIN:VCARD
Name: Ms Nhung
TELEPHONE:011287633
END:VCARD
BEGIN:VCARD
Name: Dr. Drake Ramoray
TELEPHONE:0123456789
END:VCARD
$ IFS="$OLDIFS" # restore old IFS
Explicação:
- Aqui, o printf obtém 6 argumentos além da string de formato: 6 linhas separadas por caractere de nova linha (que definimos como
IFS
). - printf, em seguida, descobre que sua string de formato contém 2
%s
entradas. Então, ele divide 6 argumentos em 3 grupos de 2 argumentos. - Para cada grupo, imprime a string formatada.