awk基于列合并行

awk基于列合并行,awk,Awk,要将基于第一列$1的行合并到行中,并格式化输出。打印标题时,需要生成第一个字段的最大唯一计数。 例如,安哥拉显示计数=3,巴西显示计数=5,赞比亚显示计数=1。 字段$1的最大唯一计数为5,因此需要打印标题5次,以便为所有字段提供正确的标题 打印输出时,希望保留原始输入文件行顺序。 我的实际输入文件过去是不同的,比如10个字段,12个字段等等 Input.csv Country,Network,Details,Amount Angola,voda,xxx,10 Angola,at&t,x

要将基于第一列
$1
的行合并到行中,并格式化输出。打印标题时,需要生成第一个字段的最大唯一计数。 例如,安哥拉显示计数=3,巴西显示计数=5,赞比亚显示计数=1。 字段$1的最大唯一计数为5,因此需要打印标题5次,以便为所有字段提供正确的标题

打印输出时,希望保留
原始输入文件
行顺序。 我的实际输入文件过去是不同的,比如10个字段,12个字段等等

Input.csv

Country,Network,Details,Amount
Angola,voda,xxx,10
Angola,at&t,xxx,20
Angola,mtn,xxx,30
Brazil,voda,yyy,40
Brazil,voda,yyy,50
Brazil,at&t,yyy,60
Brazil,mtn,yyy,70
Brazil,voda,yyy,80
Zambia,tcl,zzz,90
所需输出.csv

Country,Network,Details,Amount,Country,Network,Details,Amount,Country,Network,Details,Amount,Country,Network,Details,Amount,Country,Network,Details,Amount
Angola,voda,xxx,10,Angola,at&t,xxx,20,Angola,mtn,xxx,30
Brazil,voda,yyy,40,Brazil,voda,yyy,50,Brazil,at&t,yyy,60,Brazil,mtn,yyy,70,Brazil,voda,yyy,80
Zambia,tcl,zzz,90
目前,我正在使用以下两个命令来获得所需的输出,并根据实际输入文件中的字段数手动更改每次的计数

步骤:#1


awk'开始{while(count++
awk
一行:

awk 'BEGIN{FS=OFS=","}FNR==1{n=$0;next}{a[$1]=($1 in a ? a[$1] OFS:"")$0; if(!($1 in b)){o[++i]=$1}; b[$1]++; mx=mx>b[$1]?mx:b[$1] }END{for(i=1; i<=mx; i++)printf("%s%s",n,i==mx?RS:OFS); for(i=1; i in o; i++)print a[o[i]]}' infile
输出:

$ cat infile
Country,Network,Details,Amount
Angola,voda,xxx,10
Angola,at&t,xxx,20
Angola,mtn,xxx,30
Brazil,voda,yyy,40
Brazil,voda,yyy,50
Brazil,at&t,yyy,60
Brazil,mtn,yyy,70
Brazil,voda,yyy,80
Zambia,tcl,zzz,90
$ awk 'BEGIN{FS=OFS=","}FNR==1{n=$0;next}{a[$1]=($1 in a ? a[$1] OFS:"")$0; if(!($1 in b)){o[++i]=$1}; b[$1]++; mx=mx>b[$1]?mx:b[$1] }END{for(i=1; i<=mx; i++)printf("%s%s",n,i==mx?RS:OFS); for(i=1; i in o; i++)print a[o[i]]}' infile
Country,Network,Details,Amount,Country,Network,Details,Amount,Country,Network,Details,Amount,Country,Network,Details,Amount,Country,Network,Details,Amount
Angola,voda,xxx,10,Angola,at&t,xxx,20,Angola,mtn,xxx,30
Brazil,voda,yyy,40,Brazil,voda,yyy,50,Brazil,at&t,yyy,60,Brazil,mtn,yyy,70,Brazil,voda,yyy,80
Zambia,tcl,zzz,90
awk 'BEGIN{
            FS=OFS=","
     }
     FNR==1{
            n=$0;
            next
     }
     {
           a[$1]=($1 in a ? a[$1] OFS:"")$0;
           if(!($1 in b)){ o[++i]=$1 }; 
           b[$1]++; 
           mx=mx>b[$1]?mx:b[$1] 
     }
    END{
           for(i=1; i<=mx; i++)
               printf("%s%s",n,i==mx?RS:OFS); 

            for(i=1; i in o; i++)
                print a[o[i]]
     }' infile
awk 'BEGIN{
            FS=OFS=","
     }
     FNR==1{
            n=$0;
            next
     }
     {
           # this line modified
           # look for char pos of comma, 

           a[$1]=($1 in a ? a[$1] OFS substr($0,index($0,",")+1) : $0);

           if(!($1 in b)){ o[++i]=$1 }; 

           b[$1]++; 
           mx=mx>b[$1]?mx:b[$1] 
     }
    END{
           for(i=1; i<=mx; i++)
              # this line modified
              printf("%s%s",i==1?n:substr(n,index(n,",")+1),i==mx?RS:OFS);

            for(i=1; i in o; i++)
                print a[o[i]]
     }' infile
$awk'BEGIN{FS=OFS=“,”}FNR==1{n=$0;next}{a[$1]=(a中的$1[$1]:)$0;if(!(b中的$1)){o[++i]=$1};b[$1+;mx=mx>b[$1]?mx:b[$1]}END{for(i=1;ib 1]?mx:b[$1]
}
结束{

对于(i=1;iyou可以保留一个类似于
OrderNum[$1]+
的数组,并将其作为外部循环添加到END print语句中,但是为什么不直接使用
awk'{existing prog}'| sort
(因为您的输入数据似乎是按国家名称排序的)祝你好运。还有…加上uno,写得很好的Q,有小样本数据,需要输出,还有…喘息,一些非常接近的代码!继续发帖,祝你好运!想知道在哪里更改代码,打印“国家”在第一次输出中,如果我不需要第二次打印相同的国家名称,第三次哇,伟大的Akshay Hegde,保留岩石
awk 'BEGIN{
            FS=OFS=","
     }
     FNR==1{
            n=$0;
            next
     }
     {
           a[$1]=($1 in a ? a[$1] OFS:"")$0;
           if(!($1 in b)){ o[++i]=$1 }; 
           b[$1]++; 
           mx=mx>b[$1]?mx:b[$1] 
     }
    END{
           for(i=1; i<=mx; i++)
               printf("%s%s",n,i==mx?RS:OFS); 

            for(i=1; i in o; i++)
                print a[o[i]]
     }' infile
$ awk 'BEGIN{FS=OFS=","}FNR==1{n=$0;next}{a[$1]=($1 in a ? a[$1] OFS substr($0,index($0,",")+1) : $0); if(!($1 in b)){o[++i]=$1}; b[$1]++; mx=mx>b[$1]?mx:b[$1] }END{for(i=1; i<=mx; i++)printf("%s%s",i==1?n:substr(n,index(n,",")+1),i==mx?RS:OFS); for(i=1; i in o; i++)print a[o[i]]}' infile
Country,Network,Details,Amount,Network,Details,Amount,Network,Details,Amount,Network,Details,Amount,Network,Details,Amount
Angola,voda,xxx,10,at&t,xxx,20,mtn,xxx,30
Brazil,voda,yyy,40,voda,yyy,50,at&t,yyy,60,mtn,yyy,70,voda,yyy,80
Zambia,tcl,zzz,90
awk 'BEGIN{
            FS=OFS=","
     }
     FNR==1{
            n=$0;
            next
     }
     {
           # this line modified
           # look for char pos of comma, 

           a[$1]=($1 in a ? a[$1] OFS substr($0,index($0,",")+1) : $0);

           if(!($1 in b)){ o[++i]=$1 }; 

           b[$1]++; 
           mx=mx>b[$1]?mx:b[$1] 
     }
    END{
           for(i=1; i<=mx; i++)
              # this line modified
              printf("%s%s",i==1?n:substr(n,index(n,",")+1),i==mx?RS:OFS);

            for(i=1; i in o; i++)
                print a[o[i]]
     }' infile