Unix: Imprimir coluna extra de valores para arquivo

1

Eu tenho um arquivo .txt ( new_file.txt ) com uma coluna de valores (200). Preciso imprimir outra coluna ao lado, com valores 0,1 / 200,2 / 200 ..... 1. Como devo fazer isso? Eu sou novo nisso, então qualquer sugestão será ótima!

Eu sei que seq 0 0.005 1 >new_file.txt irá imprimi-lo no arquivo, mas substitui os valores já presentes. Eu quero adicionar esses números como outra coluna ao lado dos valores já presentes no arquivo.

A entrada é como:

2.41
2.56 

em uma coluna. Eu preciso que pareça com

2.41 0
2.56 0.005

em uma coluna. Eu preciso ter uma aba no meio.

    
por Epari shalini 02.07.2017 / 04:33

3 respostas

1

Com seq e paste :

seq 0 0.005 1 | paste newfile.txt - > newerfile.txt

com awk

awk '{$2 = 0.005*(NR-1)} 1' OFS='\t' newfile.txt > newerfile.txt

Dependendo da sua versão de awk , você pode modificar newfile.txt no lugar.

    
por 02.07.2017 / 05:57
1

Como mencionado nos comentários, paste é a melhor opção para fazer o que você deseja.

 paste new_file.txt <sequence file>

Se você quiser gerar uma sequência em tempo de execução

seq 0 0.005 1 | paste new_file.txt /dev/stdin

Exemplo (para 5 registros em new_file.txt )

~$ seq 0 0.005 0.020 | paste new_file.txt /dev/stdin
2.41    0.000
2.56    0.005
2.71    0.010
2.86    0.015
3.01    0.020

Nota: Se algum arquivo / comando tiver linhas extras, as linhas correspondentes na saída ficarão em branco. Portanto, certifique-se de que ambos os arquivos tenham o mesmo número de linhas.

    
por 02.07.2017 / 05:51
0

Você pode fazer isso usando GNU dc da seguinte forma:

< new_file.txt tr -- - _ | dc -e "[q]sq [?z1=qrd1<qrn32anp0.005+dd=?]s? 0l?x"

Explicação:

dc -e '
# macro for quitting
[q]sq

# macro to read next line and perform operations
[
   ? z1=q  # read next line and quit when it is empty. The 1 is apriori
   r       # else, reverse the stack elements so that sum is top of stack now
   d1<q    # quit if current sum is more than 1
   r       # else, reverse the stack elements so that line is top of stack now
   n 32an p # print the line, space (32a is ascii decimal for space), & print current sum
   0.005+   # update the current sum for next round
   dd=?     # recursively invoke itself for more.... its a loop essentially
]s?

# initialize stack and start operations
0 l?x
'
    
por 02.07.2017 / 21:07

Tags