列値に基づいてCSVの行を集計する方法

列値に基づいてCSVの行を集計する方法

私の入力は、次のようにソートされたCSVファイルです(:通常のカンマではなくフィールド区切り文字として使用されます)。

version:device
1.0.0:dev1
1.0.0:dev2
1.2.3:dev3
1.3.4:dev4
1.3.4:dev5

各バージョンが1行になるように集計したいと思います。

version:devices
1.0.0:dev1,dev2
1.2.3:dev3
1.3.4:dev4,dev5

答え1

GNUを使用して、datamashコロンで区切られた最初のフィールドにグループ化し、2番目のフィールドを折りたたみます。

$ datamash -t : groupby 1 collapse 2 <file
version:device
1.0.0:dev1,dev2
1.2.3:dev3
1.3.4:dev4,dev5

答え2

非常に素晴らしいツールです。

mlr --csv --fs : group-by version then nest --ivar , -f device file.csv
version:device
1.0.0:dev1,dev2
1.2.3:dev3
1.3.4:dev4,dev5

答え3

努力する

awk -F: '$1 == before { printf ",%s",$2 ; } 
         $1 != before { printf "%s%s",nl,$0 ; before=$1 ; nl="\n" } 
         END {printf nl ; }' 

どこ

  • -F::awkに区切り文字として使用するように指示する
  • printf"\n"tol()でない限り、改行文字を印刷しないでください。
  • これは1行(たとえばawk -F: '....' file)です。読みやすくするために行を区切りました。

nlこれは2つの変数を使用して新しい行()と古い行の値を保持します$1

答え4

awk -F: -v OFS=: '
    NR == 1{print;next} 
    !v {v=$1;d=$2;next} 
    v == $1 {d = d","$2}
    v != $1 {print v,d;v=$1;d=$2}
    END{print v,d}
' file

関連情報