Como adicionar uma coluna de números a um arquivo de dados de matriz

0

Eu tenho um arquivo de dados com duas colunas de números:

arquivo de entrada

4.182   4.1843
4.184   4.2648
4.2281  4.0819
4.2204  4.1676
4.0482  4.1683
4.0156  4.2895
4.4504  5.2369
4.3776  4.4979
4.3797  4.1372
4.1411  4.0528

Eu preciso inserir uma coluna de números uniformemente espaçada para o arquivo de dados de entrada. Por exemplo, na saída foram inseridos uma coluna de números espaçados por 5., então os números são 1, 6, 11,16 e assim por diante

saída

1   4.182   4.1843
6   4.184   4.2648
11  4.2281  4.0819
16  4.2204  4.1676
21  4.0482  4.1683
26  4.0156  4.2895
31  4.4504  5.2369
36  4.3776  4.4979
41  4.3797  4.1372
46  4.1411  4.0528
    
por alloppp 21.06.2016 / 21:26

2 respostas

0

Se eu entendi sua geração de índice corretamente, então

awk '{print 5*(NR-1)+1" "$0}' yourfile > oufile

deve fazer isso. Se você quiser uma saída mais bonita, use printf , por exemplo,

$ awk '{printf "%-3d %s\n", 5*(NR-1)+1, $0}' yourfile
1   4.184   4.2648
6   4.2281  4.0819
11  4.2204  4.1676
16  4.0482  4.1683
21  4.0156  4.2895
26  4.4504  5.2369
31  4.3776  4.4979
36  4.3797  4.1372
41  4.1411  4.0528
    
por 21.06.2016 / 22:21
1
  1. Crie uma coluna de índice no arquivo de dados original, usando pr -t -n .
  2. Crie os dados de índice a serem inseridos como a nova coluna, com cada linha de dados indexados indexados pelo número da linha. Eu usei uma pequena função bash para fazer isso abaixo.
  3. Junte-se à coluna de índice com os dados usando join .

Aqui está um script bash para demonstrar:

#!/usr/bin/env bash
# insert-counts.sh

cols='/tmp/cols'
cat <<'EOF' | pr -t -n >$cols
4.184   4.2648
4.2281  4.0819
4.2204  4.1676
4.0482  4.1683
4.0156  4.2895
4.4504  5.2369
4.3776  4.4979
4.3797  4.1372
4.1411  4.0528
EOF

# gen_index START NUM INC
gen_index() {
  local start="$1" num="$2" inc="$3"
  local x
  for ((x = 0; x < num; x++)); do
    printf "%2d  %4d\n" $(( x + 1 )) $(( start + (x * inc) ))
  done
}

lines='wc -l <$cols'

gen_index 1 $lines 5 |
join -o 1.2 -o 2.2 -o 2.3 - $cols |
awk '{printf("%4d  %8.4f  %8.4f\n",$1,$2,$3);}'

E aqui está a saída:

$ ./insert_counts.sh
   1    4.1840    4.2648
   6    4.2281    4.0819
  11    4.2204    4.1676
  16    4.0482    4.1683
  21    4.0156    4.2895
  26    4.4504    5.2369
  31    4.3776    4.4979
  36    4.3797    4.1372
  41    4.1411    4.0528
    
por 21.06.2016 / 22:10