Ler uma linha de tamanho variável e dividir seu conteúdo em linhas separadas com texto

1

Eu tenho um arquivo com o cabeçalho (primeira linha) com um comprimento variável; e vem como:

"One"|"Two"|"Three"

ou

"One"|"Two"|"Three"|...|"One Hundred"

e deseja fazer um loop que o transforma em um novo arquivo:

"Hello One!"
"Hello Two!"
"Hello Three! ..."
"Hello One Hundred!"

O que devo fazer? Use o awk? sed?

Não consegui encontrar uma solução sem corrigir o tamanho.

Meu sistema operacional é Linux-RedHat-RHEL-6 .

    
por UberM 10.09.2015 / 18:16

2 respostas

1

bash: leia as palavras separadas por pipe em uma matriz

IFS='|' read -ra words < <(head -n 1 file)
printf "Hello %s!\n" "${words[@]}"

awk: iterar as palavras na linha.

awk -F'|' 'NR == 1 { for (i=1; i<=NF; i++) print "Hello " $i "!"; exit}' file

e um sed:

sed -e 2Q -e 's/\([^|]\+\)/Hello !/g' -e 's/[|]/\n/g' file
    
por 10.09.2015 / 18:20
2

Aqui, uma solução simples com duas chamadas sed (assume que todas as linhas são citadas):

sed -n '1s#"|"#"\n"#gp' file | sed 's#"\(.*\)"#"Hello !"#'

Primeiro comando sed substitui "|" com novas linhas. Em segundo lugar, adiciona os textos e o ponto de exclamação.

Se não houver | dentro dos dados e em torno de " forem opcionais, você também poderá usar (deve ser mais rápido):

head -1 file | tr \| \n | sed 's#"\?\(.*\)"\?#"Hello !"#'
    
por 10.09.2015 / 18:34