Faz o loop através do arquivo e torna cada palavra uma variável?

3

Eu tenho um arquivo de texto com esta aparência:

1923.12.312. Nikl
12391.123.123 Jo
12398123.123912 Ad

Eu estou tentando percorrer esse arquivo, e faço 1923.12.312. variable1 e Nikl variable2 usar esses em um comando echo. Em seguida, ele deve continuar e gerar 12391.123.123 variable1 e Jo variable2 e ecoar etc.

Até agora, foi o que fiz:

while read p
do 
variable1="$(awk '{print $1}')"
variable2="$(awk '{print $2}')"
echo "if [ \"\$STATUS\" == \"$variable1\" ]
then
vem=\"$variable2\"
fi"
done saker.txt

E isso é para colocar:

if [ "$STATUS" == "1923.12.312." ]
then
vem="NIKL"
fi

Mas isso não acontece, ao contrário, esta é a saída

awk: cmd. line:1: {print $2)
awk: cmd. line:1:          ^ syntax error
if [ "STATUS" == "12391.123.123
12398123.123912" ]
then
vem=""
fi

Eu também tentei abandonar as variáveis e fiz isso:

while read p
do 
echo "if [ \"\$STATUS\" == \"'awk '{print $1}''\" ]
then
vem=\"'awk '{print $2}''\"
fi"
done saker.txt

Mas produziu o mesmo resultado.

    
por DisplayName 01.12.2015 / 02:10

2 respostas

3

Usando o shell

Se usarmos a capacidade de ler para separar linhas em variáveis e é muito fácil:

while read var1 var2
do
    echo "if [ \"\$status\" == \"$var1\" ]
then
vem=\"$var2\"
fi"
done <saker.txt

Isso produz:

if [ "$status" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$status" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$status" == "12398123.123912" ]
then
vem="Ad"
fi

Usando o awk:

Este comando do awk usa um único comando printf :

$ awk '{printf "if [ \"$status\" == \"%s\" ]\nthen\nvem=\"%s\"\nfi\n",$1,$2}' saker.txt
if [ "$status" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$status" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$status" == "12398123.123912" ]
then
vem="Ad"
fi
    
por 01.12.2015 / 02:39
2

É minha strong suspeita de que você não deveria estar executando um script para atualizar seu script. Em vez disso, você deve apenas chamar awk de seu script original e obter os dados necessários dessa maneira. Então saker.txt poderia simplesmente ser usado como um arquivo de configuração (o que é) para mudar o comportamento do seu script (ao invés de usá-lo para mudar a saída do script de criação de script).

Eu tenho dados muito limitados em seu script, obviamente, mas o que parece é que você está usando saker.txt como uma tabela de pesquisa para definir uma variável em seu script.

Especificamente, o snippet de script:

if [ "$STATUS" == "1923.12.312." ]
then
vem="Nikl"
fi
if [ "$STATUS" == "12391.123.123" ]
then
vem="Jo"
fi
if [ "$STATUS" == "12398123.123912" ]
then
vem="Ad"
fi

pode ser funcionalmente reproduzido com um script awk embutido como segue:

vem=$( awk -v status="$STATUS" '$1 == status { printf "%s", $2 ; exit }' saker.txt )

Isso responde "Como posso definir uma variável em bash com base em procurar o valor de outra variável em um arquivo?" que é o que parece que você está tentando realizar executando seu script para atualizar seu script.

Há advertências, é claro, como "E se o valor de $STATUS não estiver listado em saker.txt ?" "E se for listado duas vezes?" "Como posso definir um valor padrão para vem ?" Mas você ainda tem todas essas advertências, e mais, com um script de atualização de script.

EDIT: Se você quiser permitir espaços no valor de vem como determinado no arquivo saker.txt , é melhor usar outra coisa para um delimitador, como uma guia:

$ cat saker.txt
1923.12.312.    Nikl
12391.123.123   Jo
12398123.123912 Ad

Em seguida, use a seguinte versão do awk one-liner:

vem=$( awk -Ft -v status="$STATUS" '$1 == status { printf "%s", $2 ; exit }' saker.txt )

Uma advertência sobre os delimitadores de tabulação: certifique-se de não usar a guia mais de um . Diferentemente do tratamento "delimitado por espaço em branco" de awk , quando você define explicitamente o delimitador como uma TAB apenas, a guia each é contada como um delimitador, independentemente de haver texto entre as guias. Portanto, 10000<tab><tab>John será considerado como TRÊS campos: "10000", "" (campo vazio) e "John".

    
por 01.12.2015 / 03:09

Tags