Cómo agregar una columna de números a un archivo de datos de matriz

Cómo agregar una columna de números a un archivo de datos de matriz

Tengo un archivo de datos con dos columnas de números:

fichero 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

Necesito insertar una columna de números espaciados uniformemente en el archivo de datos de entrada. Por ejemplo, en la salida se insertó una columna de números espaciados por 5, por lo que los números son 1, 6, 11,16, etc.

producción

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

Respuesta1

  1. Cree una columna de índice en el archivo de datos original, usando pr -t -n.
  2. Cree los datos de índice que se insertarán como la nueva columna, con cada fila de datos de índice indexada por el número de fila.Utilicé una pequeña función bash para hacer esto a continuación.
  3. Disfruta elcolumna de índicecon eldatosusando join.

Aquí hay un script bash para demostrarlo:

#!/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);}'

Y aquí está el resultado:

$ ./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

Respuesta2

Si entiendo correctamente la generación de su índice, entonces

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

Deberías hacerlo. Si desea una salida más bonita, puede usar printfen su lugar, por ejemplo

$ 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

información relacionada