配列データファイルに数値の列を追加する方法

配列データファイルに数値の列を追加する方法

2 列の数字を含むデータ ファイルがあります。

入力ファイル

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

入力データファイルに等間隔の数字の列を挿入する必要があります。たとえば、出力には5間隔の数字の列が挿入されます。つまり、数字は1、6、11、16などです。

出力

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

答え1

  1. を使用して、元のデータ ファイルにインデックス列を作成しますpr -t -n
  2. 新しい列として挿入するインデックス データを作成し、インデックス データの各行を行番号でインデックス付けします。以下では、これを実行するために小さな bash 関数を使用しました。
  3. 参加するインデックス列とともにデータを使用しますjoin

以下はデモンストレーション用の bash スクリプトです:

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

そして、出力は次のようになります。

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

答え2

インデックス生成を正しく理解していれば、

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

で十分でしょう。よりきれいな出力が欲しければ、printf代わりに例えば次のようにします。

$ 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

関連情報