2つの列を持つCSVファイルがあります。つまり、最初の列:ファイル名2番目の列:アクセスステータス
以下は、いくつかの例のレコードです。
FileA, CREATE
FileA, MODIFY
FileA, DELETE
FileB, CREATE
FileB, MODIFY
最初の列の異なる値に基づいて2番目の列の値を単一の行に変換する必要があります。
FileA, CREATE|MODIFY|DELETE
FileB, CREATE|MODIFY
答え1
また試み
awk '
$1 != LAST {printf "%s%s ", LD, $1 # print every new COL1 value
LAST = $1 # and remeber it
LD = RS # set the line delimiter (empty at program start)
FD = "" # unset field delimiter
}
{printf "%s%s", FD, $2 # print successive second fields, after field delim
FD = "|" # set the field delimiter
}
END {printf RS # last action: new line
}
' file
FileA, CREATE|MODIFY|DELETE
FileB, CREATE|MODIFY
答え2
コマンドの順序を気にしない場合は、次のものを使用できます。
$ awk -F"[, ]" '{
a[$1][$2]++
}
END{
for(i in a){
printf "%s,",i;
for(k in a[i]){
printf "%s|", k
}
print ""
}
}' file | sed 's/|$//'
FileA, DELETE|CREATE|MODIFY
FileB, CREATE|MODIFY
この順序が必要な場合は、Perl魔法を適用できます。
$ sed 's/ //' file |
perl -F, -lne 'push @{$k{$F[0]}},$F[1]; }{
print "$_, ",join "|", @{$k{$_}} for keys(%k);'
FileB, CREATE|MODIFY
FileA, CREATE|MODIFY|DELETE
答え3
awk '1 {if (a[$1]) {a[$1] = a[$1]" "$2"|"} else {a[$1] = $2"|"}} END {for (i in a) { print i,a[i]}}' file |sed 's/.$//'
答え4
GNU awkを使用してソートされた順序で出力
gawk -F', ' '
{ a[$1] = a[$1] "|" $2 }
END {
PROCINFO["sorted_in"] = "@ind_str_asc"
for (b in a) print b ", " substr(a[b], 2)
}
'
キーの元の順序で出力するには、次のようにします。
awk -F', ' '
!($1 in a) { keys[++count] = $1 }
{ a[$1] = a[$1] "|" $2 }
END {
for (i = 1; i <= count; i++)
print keys[i] ", " substr(a[keys[i]], 2)
}
'