
私の入力は、次のようにソートされた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