2017-10-05 112 views
3

想要將基於第一列$1的行合併到行中並格式化輸出。在打印標題時需要生成Max Unique count of first field. 例如,安哥拉出現count = 3,巴西出現count = 5,贊比亞出現count = 1。 字段$ 1的最大唯一計數爲5,因此需要打印標題5次才能爲所有字段設置適當的標題。awk根據列合併行

雖然打印輸出,想保留original input file一行訂單。 曾經是我的實際輸入文件變化等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 

期望Output.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 

目前,我使用下面2命令來獲取所需的輸出,並根據實際輸入文件中的字段數量手動更改計數。

步驟:#1

awk 'BEGIN { while (count++<5) header=header "Country,Network,Details,Amount,"; print header }' > output.csv 

步驟:#2

awk -F, ' 
    /.+/{ 
     if (!($1 in Val)) { Key[++i] = $1; } 
     Val[$1] = Val[$1] $0 ","; 
    } 
    END{ 
     for (j = 1; j <= i; j++) { 
      print(Val[Key[j]]); 
     } 
    }' input.csv >> output.csv 

尋找你的建議...

+0

你可以保持像'ORDERNUM [$ 1]數組++'並補充說,作爲外環帶動您的最終打印語句,但爲什麼不直接使用'的awk「{現有PROG}」 |排序「(因爲你的輸入數據似乎是按國名排序)?祝你好運。 – shellter

+0

而且......用一個寫得很好的Q加上小樣本數據,需要的輸出和......喘氣,一些非常接近的代碼!繼續發帖,祝你好運! – shellter

回答

4

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}{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 

解釋與修改:

  • index(in, find)

搜索字符串中的字符串中找到第一次出現,並 以0開頭的字符返回位置字符串中。

  • substr(string, start [, length ])

    返回字符串的長度字符長的串,起始於 字符數目開始。

+0

非常感謝Akshay Hegde,Up-voteed !!! – SVR

+0

@RVS:更新爲訂購 –

+0

想知道在哪裏更改代碼,只在第一次打印「國家」時才輸出,如果我不需要第二次打印同一國家名稱,第三次 – SVR