使用awk或任何其他shell命令对列中的数据进行分组

时间:2014-12-19 05:43:46

标签: shell awk sed

我可以使用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命令帮助我格式化输入。

谢谢, 临空

3 个答案:

答案 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 YX的键,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版本