我有一个如下的csv文件
a,123,xyz
a,345,zyx
b,123,xyz
b,345,zyx
我想将第一列与该行中的相同值合并。像下面一样
a,123,xyz
345,zyx
b,123,xyz
345,zyx
我已经对文件进行了排序,并试图对值进行计数,但由于需要在shell脚本中进行操作而无法继续
答案 0 :(得分:1)
您可以使用以下awk代码段获取所需的输出:
awk -F, '{ if (f == $1) { for (c=0; c <length($1) + length(FS); c++) printf " "; print $2 FS $3 } else { print $0 } } { f = $1 }' FILE
或者只是格式化的awk程序:
{
if (f == $1) {
for (c=0; c < length($1) + length(FS); c++)
printf " "
print $2 FS $3
} else {
print $0
}
}
{
f = $1
}
说明:
如果第一字段($1
)与上一行(f
的第一字段匹配,该字段在处理f = $1
的每一行结束时分配),则我们打印字段长度要省略的空格加上字段分隔符(FS
)的长度。否则,我们只打印整行($0
)。
如果需要保留逗号,则awk程序应为:
{
if (f == $1) {
for (c=0; c < length($1); c++)
printf " "
print FS $2 FS $3
} else {
print $0
}
}
{
f = $1
}
这将打印:
a,123,xyz
,345,zyx
b,123,xyz
,345,zyx
答案 1 :(得分:0)
只需:
awk '$1==p{sub("[^,]*,",s)}
{p=$1; s = sprintf("%"(1 + length(p))"s","")}1' FS=, OFS=, input
如果您不用担心前导缩进,这会简单得多:
awk '$1==p{sub("[^,]*,","")}{p=$1}1' FS=, OFS=, input