Substituir condicionalmente os itens da coluna pelo conteúdo de outra coluna

0

Eu tenho dados de preços financeiros em um arquivo csv, uma linha típica da qual se parece com isso:

2012-06-06 18:00:00,2012-06-06 19:00:00,4,2012-06-06 14:00:00,4,1644.8005,1644.8,1631.232,1632.266,7353,TRUE

e eu gostaria de substituir condicionalmente, neste exemplo em particular, o conteúdo da coluna 7 com o da coluna 6, de tal forma que as colunas 6 e 7 contenham o mesmo valor.

Os números de linha de arquivo nos quais tais operações condicionais devem ser concluídas devem ser lidos de um arquivo de texto separado (vamos chamá-lo de "line_index_file" que é produzido por outro programa, Octave) e isso se parece, por exemplo:

100
125

, o que significa que as operações acima só devem ser aplicadas às linhas 100 e 125 do arquivo de dados original.

Como eu faria isso com sed ou awk?

    
por babelproofreader 18.08.2018 / 17:25

3 respostas

1

Você também pode usar o editor sed para executar essa tarefa:

cmds=$(< line_index_file xargs -l printf '\t%sba\n')

sed -e "
${cmds}
    ;# skip these
    b
    :a
    s/,/\n/5;s//\n/5;s//\n/5
    s/\n\(.*\)\n.*\n/,,,/
" input.csv

Explicação:

  • Primeiro, crie uma variável de shell, cmds , mantendo a ramificação no rótulo :a information para as linhas mencionadas no line_index_file .
  • Ignore o processamento das outras linhas, ou seja, aquelas linhas que não são mencionadas no arquivo line_index_.
  • Coloque um marcador \n (uma vez que uma nova linha não será encontrada no espaço padrão de sed no nosso caso) no final do 5º, 6º e 7º campos.
  • Em seguida, execute a operação para colocar o conteúdo do sexto campo no sétimo.
por 19.08.2018 / 12:54
1

Você pode tentar este awk

awk 'BEGIN{FS=OFS=","}NR==FNR{a[$0];next}FNR in a {$7=$6}1' line_index_file file.csv
    
por 18.08.2018 / 19:38
0

Tente isso

 for i in 'cat line_index_file'
 do
     echo -e "'awk -v b=$i -F ',' 'BEGIN{OFS = ","} NR!=b{$7=$6};{print $0}' file.csv'" > file.csv
 done
  • NR!=b ignora os números de linha da condição
por 18.08.2018 / 17:36

Tags