So fügen Sie einer Array-Datendatei eine Zahlenspalte hinzu

So fügen Sie einer Array-Datendatei eine Zahlenspalte hinzu

Ich habe eine Datendatei mit zwei Zahlenspalten:

Eingabedatei

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

Ich muss eine Spalte mit Zahlen mit gleichmäßigem Abstand in die Eingabedatendatei einfügen. Beispielsweise wurde in die Ausgabe eine Spalte mit Zahlen mit einem Abstand von 5 eingefügt, also sind die Zahlen 1, 6, 11, 16 usw.

Ausgabe

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

Antwort1

  1. Erstellen Sie mit eine Indexspalte in der Originaldatendatei pr -t -n.
  2. Erstellen Sie die Indexdaten, die als neue Spalte eingefügt werden sollen, wobei jede Zeile der Indexdaten durch die Zeilennummer indiziert wird.Dazu habe ich unten eine kleine Bash-Funktion verwendet.
  3. Werden Sie Mitglied derIndexspaltemit demDatenmit join.

Hier ist ein Bash-Skript zur Demonstration:

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

Und hier ist die Ausgabe:

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

Antwort2

Wenn ich Ihre Indexgenerierung richtig verstehe, dann

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

sollte es tun. Wenn Sie eine schönere Ausgabe wünschen, können Sie printfstattdessen z. B. verwenden

$ 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

verwandte Informationen