O Linux substitui o último caractere em um arquivo csv por uma nova string

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.

Os dados são assim:

124,Y,Y,Y,Y,S
125,Y,Y,Y,Y,B
126,Y,N,N,N,B
140,Y,Y,N,N,F

O caractere deve retornar o seguinte valor:

B = BENIGN
C = CUSTOMER
F = FRAME
P = PPCOS
S = STANDARD
W = W-RED

Como posso substituir o último caractere do arquivo csv e convertê-lo para o seguinte?

124,Y,Y,Y,Y,STANDARD
125,Y,Y,Y,Y,BENING
126,Y,N,N,N,BENING
140,Y,Y,N,N,FRAME
    
por yesco1 06.08.2015 / 20:31

3 respostas

0

Use sed:

sed s'/S/STANDARD/g'
sed s'/C/Customer/g'
...
...

Esta solução simples só funcionará se você não tiver outras letras maiúsculas com o mesmo valor no campo CSV.

Se você precisar que ele seja apenas o último caractere, adicione $ a ele para que ele olhe apenas no final da linha.

echo "124,Y,Y,Y,Y,S" | sed s'/S$/STANDARD/'

124,Y,Y,Y,Y,STANDARD
    
por 06.08.2015 / 20:40
0

com awk :

awk -F'[, ]' 'FNR==NR{a[$1]=$NF;next};$NF=a[$NF]' OFS=, file2 file1

em que file1 é o arquivo de caracteres, file2 é o arquivo de dados.

    
por 06.08.2015 / 21:11
0

Embora a solução de don_crissti seja muito profissional, acho que deve haver também uma versão mais amigável para iniciantes, já que nenhum dos funcionamentos internos de join nem (com chave) sort é algo que eu tentaria explicar um iniciante ...

O meu usa arrays e ... é, portanto, expansível , caso haja algum identificador adicionado no futuro.

O uso é scriptname <file> .

Solução mais segura: (O arquivo original não será sobrescrito; você encontrará o arquivo transformado como output.csv )

#!/bin/bash

arr_src=("B" "C" "F" "P" "S" "W")
arr_dst=("BENIGN" "CUSTOMER" "FRAME" "PPCOS" "STANDARD" "W-RED")

ftmp="$1"
fout="output.csv"
workfile=".wrkfil"
cp $ftmp $workfile # make backup!

for ((i=0;i<${#arr_src[@]};i+=1)); do
  sed -i 's/'"${arr_src[i]}"'$/'"${arr_dst[i]}"'/g' $workfile
  # echo && cat $workfile
done
mv $workfile $fout

Solução mais curta (mas mais perigosa): (O arquivo original será sobrescrito; portanto, se você pretende adicionar outra "carta", certifique-se de que os comprimentos da matriz de origem e destino sejam sempre idênticos. Caso contrário, os resultados serão imprevisíveis.)

#!/bin/bash

arr_src=("B" "C" "F" "P" "S" "W")
arr_dst=("BENIGN" "CUSTOMER" "FRAME" "PPCOS" "STANDARD" "W-RED")

fout="$1"

for ((i=0;i<${#arr_src[@]};i+=1)); do
  sed -i 's/'"${arr_src[i]}"'$/'"${arr_dst[i]}"'/g' $fout
  # echo -e "\nOutput file now: $(cat $fout)"
done
    
por 06.08.2015 / 21:10