2

次の形式のファイルがあります

id_1,1,0,2,3,lable1
id_2,3,2,2,1,lable1
id_3,5,1,7,6,lable1

各列の合計が必要です(300列以上あります)

9,3,11,10,lable1 

どうすればbashを使用してそれを行うことができますか。ここに記載されているものを使用してみましたが、うまくいきませんでした。

4

5 に答える 5

6

使用awk:

$ awk -F, '{for (i=2;i<NF;i++)a[i]+=$i}END{for (i=2;i<NF;i++) printf a[i]",";print $NF}' file
9,3,11,10,lable1

これにより、各列(i=2 .. i=n-1 から)の合計がコンマ区切りファイルに出力され、最後の行(つまり、lable1)の最後の列の値が続きます。

于 2013-02-19T11:34:31.660 に答える
1

合計を最後の列のラベルでグループ化する必要がある場合は、これを試すことができます。

awk -F, '
  {
    L[$NF]
    for(i=2; i<NF; i++) T[$NF,i]+=$i
  }
  END{
    for(i in L){
      s=i
      for(j=NF-1; j>1; j--) s=T[i,j] FS s
      print s
    }
  }
' file

最後の列のラベルがソートされている場合は、配列なしで試してメモリを節約できます。

awk -F, '
  function labelsum(){
    s=p
    for(i=NF-1; i>1; i--) s=T[i] FS s
    print s
    split(x,T)
  }
  p!=$NF{
    if(p) labelsum()
    p=$NF
  }
  {
    for(i=2; i<NF; i++) T[i]+=$i
  }
  END {
    labelsum()
  }
' file
于 2013-02-19T15:16:00.863 に答える
1

リンクしたソリューションに基づく修正版:

#!/bin/bash

colnum=6
filename="temp"

for ((i=2;i<$colnum;++i))
do
  sum=$(cut -d ',' -f $i $filename | paste -sd+ | bc)
  echo -n $sum','
done
head -1 $filename | cut -d ',' -f $colnum
于 2013-02-19T14:51:12.087 に答える
1

Perl のワンライナーは次のとおりです。

<file perl -lanF, -E 'for ( 0 .. $#F ) { $sums{ $_ } += $F[ $_ ]; } END { say join ",", map { $sums{ $_ } } sort keys %sums; }'

合計のみを行うため、例の最初と最後の列は 0 になります。

このバージョンは、出力例に従います。

<file perl -lanF, -E 'for ( 1 .. $#F - 1 ) { $sums{ $_ } += $F[ $_ ]; } END { $sums{ $#F } = $F[ -1 ]; say join ",", map { $sums{ $_ } } sort keys %sums; }'
于 2013-02-19T11:48:09.410 に答える
0

純粋な bash ソリューション:

#!/usr/bin/bash


while IFS=, read -a arr
do
        for((i=1;i<${#arr[*]}-1;i++))
        do
                ((farr[$i]=${farr[$i]}+${arr[$i]}))
        done
        farr[$i]=${arr[$i]}
done < file
(IFS=,;echo "${farr[*]}")
于 2013-02-19T16:04:26.573 に答える