Linux converte um número em uma string na 6ª coluna

1

Eu criei um script que extrai dados de um banco de dados e os carrega em um arquivo csv. Estou usando o sistema SunOS hstz1454 5.10. Existe uma maneira que eu possa traduzir / converter um número em uma string no meu arquivo csv. Portanto, se minha sexta coluna for o número 1 , converta-a em uma string Cos4 ou, se ela tiver 2 na sexta coluna, converta-a em outra string Cos6 . Eu usei um script antes disso para converter o último caractere em uma string. Pode ser semelhante ao que estou tentando fazer.

for fname in conv2015_10_TrafficProfile_data_migration.csv
do
echo "Translate each char to a string $fname"
    sed s'/S$/STANDARD/g; s/C$/CUSTOMER/g;   $fname > tmp.tmp
mv tmp.tmp $fname
done

meus dados se parecem com isso abaixo:

4,2,64,1088,80,1,Y,Y
5,2,64,1088,95,2,Y,Y
6,2,1088,39813120,0,2,Y,Y
7,2,1088,39813120,5,1,Y,Y
8,2,1088,39813120,10,2,Y,Y
    
por yesco1 16.12.2015 / 22:51

2 respostas

2

Você quer o awk. Na minha opinião, quase nunca há qualquer razão para usar o sed sobre o awk, para qualquer outra coisa além de substituições triviais (não muito mais complexas do que sed -e 's/this/that' ). Neste caso, é particularmente contraproducente.

Você pode dizer ao awk para usar, como um separador, usando -F, . Também podemos colocar uma vírgula na variável OFS do awk (separador de campo de saída) para que o comando print , que combina novamente os campos posicionais, os combine com uma vírgula:

awk -F, 'BEGIN { OFS="," } ...'

Agora vamos nos ater à lógica. O Awk suporta um tipo de "programação reativa", na medida em que permite a atribuição às variáveis de campo posicionais $1 , $2 , ... Quando você atribui a qualquer uma delas, reconstitui automaticamente a variável $0 que originalmente contém a linha de entrada. Ele reconstitui combinando os campos posicionais, com OFS entre eles. Assim, podemos fazer:

awk -F, 'BEGIN { OFS="," }
         { if ($6 == 1) $6 = "Cos4"
           else if ($6 == 2) $6 = "Cos6"
           print }' yourfile

Não é necessário regexing; Se você revisitar isso seis meses depois, será quase instantaneamente óbvio o que ele faz.

O código acima pode ser simplificado um pouco, fatorando os testes condicionais em regras awk individuais. Isso é para dizer:

awk -F, 'BEGIN { OFS="," }
         $6 == 1 { $6 = "Cos4" }
         $6 == 2 { $6 = "Cos6" }
         { print }' yourfile

Além disso, podemos "codificar golf" o { print } substituindo-o por um 1 :

awk -F, 'BEGIN { OFS="," }
         $6 == 1 { $6 = "Cos4" }
         $6 == 2 { $6 = "Cos6" }
         1' yourfile

A constante 1 serve como uma condição booleana. A condição não tem ação, portanto, o Awk fornece uma ação padrão que é { print } . Entretanto, agora, se você revisitar isso seis meses depois, terá que lembrar disso; encurtar os programas desta maneira, por vezes, cria dívida futura.

Por outro lado, uma boa transformação, já que estamos definindo OFS no bloco BEGIN , é evitar a opção -F e apenas definir FS no mesmo bloco:

awk 'BEGIN { FS = OFS = "," }
     $6 == 1 { $6 = "Cos4" }
     $6 == 2 { $6 = "Cos6" }
     { print }' yourfile

Podemos usar uma tarefa composta, muito parecida com a linguagem C. Coisas semelhantes, relacionadas, devem ser feitas juntas de maneira semelhante, se possível.

    
por 16.12.2015 / 23:08
1
sed -e's/,/&Cos\n/5' \
    -e's/\n1/4/'     \
    -e's/\n2/6/'     \
    -e's/Cos\n//' <in >out

Eu nunca entendi awk , no entanto.

    
por 16.12.2015 / 23:23

Tags