我有一个文件,其条目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
具有重复键的单个条目。
下面的代码让我得到了重复的键
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'
你能建议吗?
在
awk
:Perl 方法:
或者,也许更容易理解:
一个简短的
awk
程序将为您实现这一目标输出
在 awk 中:
awk '{arr[$1][length(arr[$1])+1]=$2}; END {for (i in arr) {printf i;if (length(arr[i])>1) {xc=" [";for (rr in arr[i]) {printf xc;printf arr[i][rr];xc=","} print "]"} else print arr[i][length(arr[i])]} }' data.txt
输出:
使用Raku(以前称为 Perl_6):
或者
使用 Raku,您可以内置哈希功能(请参阅底部的文档页面)。简而言之,上面的代码从生成的 2 个元素中获取冒号上的 ,
lines
ssplit
和s 空格,并生成一个(即键值对)。然后将每一行的散列编辑到命名(散列)对象,并将值适当地添加到它们各自的键中。":"
trim
hash
append
%h
样本输入:
样本输出:
一旦您的数据在
%h
对象中,您就可以操作输出。在上面的代码中替换.put
为.say
制表符分隔(未=>
分隔)返回。此外,您可以像这样提取与单个键关联的值(在下面添加作为最终语句):https://docs.raku.org/language/hashmap
https://docs.raku.org/language/101-basics#Hashes
步骤1
第2步
输出