我可以使用perl脚本(哈希)格式化数据。我想知道是否可以通过一些shell一个衬里来完成,这样每次我都不需要编写一个perl脚本,如果有一些变化的话 输入格式。 示例输入:
rinku a
rinku b
rinku c
rrs d
rrs e
abc f
abc g
abc h
abc i
xyz j
示例输出:
rinku a,b,c
rrs d,e
abc f,g,h,i
xyz j
请使用shell / awk / sed命令帮助我格式化输入。
谢谢, 临空
答案 0 :(得分:2)
怎么样
$ awk '{arr[$1]=arr[$1]?arr[$1]","$2:$2} END{for (i in arr) print i, arr[i]}' input
rinku a,b,c
abc f,g,h,i
rrs d,e
xyz j
答案 1 :(得分:0)
awk
程序也有关联数组,类似于Perl:
awk '{v[$1]=v[$1]","$2}END{for(k in v)print k" "substr(v[k],2)}' inputFile
对于每一行X Y
(X
的键,Y
的值),它基本上只是将,Y
附加到由X
索引的每个数组元素,利用他们都以空字符串开头的事实。
然后,由于您的值的格式为,x,y,z
,因此您只需在输出时删除第一个字符。
这会为您的输入数据生成(在inputFile
中):
rinku a,b,c
abc f,g,h,i
rrs d,e
xyz j
顺便说一句,如果您希望它的格式与原始格式一样,则可以创建program.awk
文件:
{
val[$1] = val[$1]","$2
if (length ($1) > maxlen) {
maxlen = length ($1)
}
}
END {
for (key in val) {
printf "%-*s %s\n", maxlen, key, substr(val[key],2)
}
}
并运行:
awk -f program.awk inputFile
你会得到:
rinku a,b,c
abc f,g,h,i
rrs d,e
xyz j
答案 2 :(得分:0)
sed -n ':cycle
$!N
s/^\([^[:blank:]]*\)\([[:blank:]]\{1,\}.*\)\n\1[[:blank:]]\{1,\}/\1\2,/;t cycle
P
s/.*\n//;t cycle' YourFile
尝试不使用保持缓冲区(并且不在内存中加载完整文件)
- 加载线
- 如果第一个单词与CR之后的单词相同,则通过,
重新填充CR和第一个单词
- 如果是这种情况,请在线路加载时重启
- 如果没有,请打印第一行
- 将当前缓冲区替换为第一个\n
- 如果案件在线路装载时重新启动
在GNU sed上使用--posix
的posix版本