最後の行の後にテキストファイルの列を追加します。

最後の行の後にテキストファイルの列を追加します。

私が持っている多くのデータファイルのうち、より小さいバージョンは次のとおりです。

0 0 0
0.05 9.6877884e-06 0.0024898597
0.1 4.2838688e-05 0.0049595502
0.15 0.00016929444 0.0074092494
0.2 0.00036426881 0.009839138
0.25 0.00055234582 0.012249394
0.3 0.00077448576 0.014640196
0.35 0.00082546537 0.017011717
0.4 0.0012371619 0.019364133
0.45 0.0013286382 0.02169761

最初の列が繰り返され、2番目の列の項目に元のファイルの列2以上が含まれる次のような結果が必要です。

0 0
0.05 9.6877884e-06
0.1 4.2838688e-05
0.15 0.00016929444
0.2 0.00036426881
0.25 0.00055234582
0.3 0.00077448576
0.35 0.00082546537
0.4 0.0012371619
0.45 0.0013286382
0 0
0.05 0.0024898597
0.1 0.0049595502
0.15 0.0074092494
0.2 0.009839138
0.25 0.012249394
0.3 0.014640196
0.35 0.017011717
0.4 0.019364133
0.45 0.021697611

awk '{print $1 " " $2}' data > tmp後者を使用して作成できますが、awk '{print $1 " " $3}' data >> tmp列数が増えると非常に退屈になります。

必要なことを達成するより賢い方法はありますか?

編集する

私は任意の数の列nの解決策が必要です。私のニーズに応じて、列と行の正しい順序が重要です。したがって、入力の列3は入力の列2の下に「移動」し、列4は列2と3の下になければならず、列1はその下に積み重ねなければなりません。 1列あたりの行数に関係なく、最初の列は昇順でなければなりません(例:0、0.05、...、0.45、0、0.05、...、0.45、0,0.05、..., 0.45など)。

答え1

アッ

awkスクリプトは2よりも多くの列で実行され、発生順序は下から上に保持され、列が何であるかについての前提は行われません(つまり数字なのか、並べ替えられたのかなどは関係ありません。):

{
    for (i = 2; i <= NF; i++) {
        a[j + i] = $1 " " $i
    }
    j += (i - 1);
}
END {
    OutNR = NR * NF;
    for (i = 2; i <= NF; i++) {
        for (j = 0; j < OutNR; j += NF) { 
            print a[j + i];
        }
    }
}

一方:

0 0 0 0.2340
0.05 9.6877884e-06 0.0024898597 0.2341
0.1 4.2838688e-05 0.0049595502 0.2342
0.15 0.00016929444 0.0074092494 0.2343
0.2 0.00036426881 0.009839138 0.2344
0.25 0.00055234582 0.012249394 0.2345
0.3 0.00077448576 0.014640196 0.2346
0.35 0.00082546537 0.017011717 0.2347
0.4 0.0012371619 0.019364133 0.2348
0.45 0.0013286382 0.02169761 0.2349

列で並べ替え(2..N) 次の行を押します。

0 0
0.05 9.6877884e-06
0.1 4.2838688e-05
0.15 0.00016929444
0.2 0.00036426881
0.25 0.00055234582
0.3 0.00077448576
0.35 0.00082546537
0.4 0.0012371619
0.45 0.0013286382
0 0
0.05 0.0024898597
0.1 0.0049595502
0.15 0.0074092494
0.2 0.009839138
0.25 0.012249394
0.3 0.014640196
0.35 0.017011717
0.4 0.019364133
0.45 0.02169761
0 0.2340
0.05 0.2341
0.1 0.2342
0.15 0.2343
0.2 0.2344
0.25 0.2345
0.3 0.2346
0.35 0.2347
0.4 0.2348
0.45 0.2349

ほとんどの人はテキスト処理にRを考えていませんが、すべてのオプション設定のために実際よりも複雑に見えますが、この場合は実際にはもっと簡単です。このソリューションの中心は単にrbind()多重化ですcbind()

d.in <- read.table(file = commandArgs(trailingOnly = T)[1]
                    , colClasses = "character");
d.out<-data.frame();
for (i in 2:length(d.in)) {
    d.out <- rbind(d.out, cbind(d.in[,1], d.in[,i]));
}
write.table(d.out, row.names = F, col.names = F, quote = F);

それから:

$ Rscript script.R data.txt
0 0
0.05 9.6877884e-06
0.1 4.2838688e-05
0.15 0.00016929444
0.2 0.00036426881
0.25 0.00055234582
0.3 0.00077448576
0.35 0.00082546537
0.4 0.0012371619
0.45 0.0013286382
0 0
0.05 0.0024898597
0.1 0.0049595502
0.15 0.0074092494
0.2 0.009839138
0.25 0.012249394
0.3 0.014640196
0.35 0.017011717
0.4 0.019364133
0.45 0.02169761
0 0.2340
0.05 0.2341
0.1 0.2342
0.15 0.2343
0.2 0.2344
0.25 0.2345
0.3 0.2346
0.35 0.2347
0.4 0.2348
0.45 0.2349

答え2

順序が重要でない場合は、単に次のものを使用できます。

awk '{for(i=2;i<=NF;i++)print $1,$i}' file

答え3

解決策は次のとおりですawk

$ awk '{a[i++]=$1" "$3;print $1,$2}END{for(i=0;i<length(a);i++){print a[i]}}' file
0 0
0.05 9.6877884e-06
0.1 4.2838688e-05
0.15 0.00016929444
0.2 0.00036426881
0.25 0.00055234582
0.3 0.00077448576
0.35 0.00082546537
0.4 0.0012371619
0.45 0.0013286382
0 0
0.05 0.0024898597
0.1 0.0049595502
0.15 0.0074092494
0.2 0.009839138
0.25 0.012249394
0.3 0.014640196
0.35 0.017011717
0.4 0.019364133
0.45 0.02169761

説明する

  • ファイルを処理するときは、$ 1と$ 3を配列に保存し、a0から各行の行数までのインデックスを指定します。次に$1合計を印刷します$2

  • 最後に、配列を繰り返してa各要素(つまりvalue $1 $3)を印刷します。インデックスを再利用してゼロから配列の長さまで繰り返すので、順序は維持されますa

修正する

すべてのn列に以下を使用しますperl

$ perl -anle '$h{$i++} = [@F[0..$#F]];
  END {
      for $j (1..$#F) {
          for (sort {$a<=>$b} keys %h) {
              print $h{$_}->[0]," ",$h{$_}->[$j]
          }
      }
  }' file

関連情報