同じ識別子を持つすべての行列を合計するsed
コマンドがあるかどうかを知りたいです。awk
たとえば、私のファイルはdata.txt
次のようになりますが、約1800のデータ列と約1400の行が含まれています。
ABCD:1234 1.23 0.23 0.83 0
ABCD:1234 0 1.10 0.21 0
EFGH:5678 0 1.90 0.12 8.21
IJKL:9999 1.22 0 1.84 9.21
IJKL:9999 1.44 0 12.94 0
IJKL:9999 1.32 0 24.12 2.43
後でコマンドがどのように見えるようにしたいか:
ABCD:1234 1.23 1.33 1.04 0
EFGH:5678 0 1.90 0.12 8.21
IJKL:9999 3.98 0 38.9 11.64
awk
これがsed
(私は生物学者であり、まだUnixの基礎を学んでいます)で動作するかどうかわかりません。どんな助けでも大変感謝します。
ベストアンサー1
awk
入力ファイルまたは結果テーブル全体をメモリに保存しないスクリプト:
FNR == 1 { for(i = 1; i <= NF; i++) a[i] = $i; next }
$1 == a[1] { for(i = 2; i <= NF; i++) a[i] += $i; next }
{
printf "%s", a[1]; a[1] = $1;
for(i = 2; i <= NF; i++) { printf "\t%s", a[i]; a[i] = $i };
printf "\n";
}
END {
printf "%s", a[1];
for(i = 2; i <= NF; i++) printf "\t%s", a[i];
printf "\n";
}
実行してください:
awk -f script.awk data.txt
結果:
ABCD:1234 1.23 1.33 1.04 0
EFGH:5678 0 1.90 0.12 8.21
IJKL:9999 3.98 0 38.9 11.64
注:実際には動作しますsed
が、まもなくそうすることはありません。バラよりここ理由を調べてください。