次の形式のエントリを含むファイルがありますkey: value
。
猫データ.txt
name: 'tom'
tom_age: '31'
status_tom_mar: 'yes'
school: 'anne'
fd_year_anne: '1987'
name: 'hmz'
hmz_age: '21'
status_hmz_mar: 'no'
school: 'svp'
fd_year_svp: '1982'
name: 'toli'
toli_age: '41'
同じ...
key: value
重複したキーを持つキーを1つの項目として見つけて印刷します。
以下のコードを使用すると、重複キーを取得できます。
cat data.txt | awk '{ print $1 }' | sort | uniq -d
name:
school:
しかし、私は重複キーの値を行内の位置にリンクする出力が欲しいです。
予想出力:
name: ['tom', 'hmz', 'toli']
school: ['anne', 'svp']
tom_age: '31'
status_tom_mar: 'yes'
fd_year_anne: '1987'
hmz_age: '21'
status_hmz_mar: 'no'
fd_year_svp: '1982'
toli_age: '41'
何か提案してもらえますか?
ベストアンサー1
存在するawk
:
$ awk -F': ' '
{
count[$1]++;
data[$1] = $1 in data ? data[$1]", "$2 : $2
}
END {
for (id in count) {
printf "%s: ",id;
print (count[id]>1 ? "[ "data[id]" ]" : data[id])
}
}' data.txt
hmz_age: '21'
tom_age: '31'
fd_year_anne: '1987'
school: [ 'anne', 'svp' ]
name: [ 'tom', 'hmz', 'toli' ]
toli_age: '41'
fd_year_svp: '1982'
status_hmz_mar: 'no'
status_tom_mar: 'yes'
パール方法:
$ perl -F: -lane 'push @{$k{$F[0]}},$F[1];
END{
for $key (keys(%k)){
$data="";
if(scalar(@{$k{$key}})>1){
$data="[" . join(",",@{$k{$key}}) . "]";
}
else{
$data=${$k{$key}}[0];
}
print "$key: $data"
}
}' data.txt
status_tom_mar: 'yes'
fd_year_anne: '1987'
tom_age: '31'
toli_age: '41'
fd_year_svp: '1982'
hmz_age: '21'
school: [ 'anne', 'svp']
name: [ 'tom', 'hmz', 'toli']
status_hmz_mar: 'no'
または、もう少し理解しやすいかもしれません。
perl -F: -lane '@fields=@F;
push @{$key_hash{$fields[0]}},$fields[1];
END{
for $key (keys(%key_hash)){
$data="";
@key_data=@{$key_hash{$key}};
if(scalar(@key_data)>1){
$data="[" . join(",", @key_data) . "]";
}
else{
$data=$key_data[0]
}
print "$key: $data"
}
}' data.txt