Awk

使用 awk 進行數據透視

  • January 17, 2013

我正在嘗試使用 awk 旋轉文件。這是我的輸入文件的範例:

VarName;TimeString;VarValue;Validity;Time_ms
A;23.11.201215:03:53;1;1;41236627696,7593
C;23.11.201215:03:53;2;1;41236627696,7593
D;23.11.201215:03:53;3;1;41236627696,7593
A;23.11.201215:04:53;31;1;41236628391,2037
B;23.11.201215:04:53;12;1;41236628391,2037
C;23.11.201215:04:53;1;1;41236628391,2037
D;23.11.201215:05:53;8;1;41236629097,2222
B;23.11.201215:05:53;7;1;41236629097,2222
C;23.11.201215:05:53;15;1;41236629097,2222

這是我想要的輸出:

TimeString;Time_ms;A;B;C;D
23.11.201215:03:53;41236627696,7593;1;;2;3
23.11.201215:04:53;41236628391,2037;31;12;1;
23.11.201215:05:53;41236629097,2222;;7;15;8    

獲得此結果的最佳方法是什麼?

使用@steve 編寫的腳本解決

這是使用gawk. 像這樣執行:

awk -f script.awk file

內容script.awk

BEGIN {
   FS=OFS=";"
}

NR==1 {
   r = $2 FS $5
   next
}

{
   !x[$1]
   a[$2,$5][$1]=$3
}

END {

   m = asorti(x,y)
   for (k=1;k<=m;k++) {
       r = r FS y[k]
   }
   print r

   n = asorti(a,b)
   for (i=1;i<=n;i++) {
       for (j=1;j<=m;j++) {
           for (k in a[b[i]]) {
               if (k == y[j]) {
                   var = a[b[i]][k]
               }
           }

           line = line FS var
           var = ""
       }
       sub(SUBSEP, FS, b[i])

       print b[i] line
       line = ""
   }
}

或者,這是一個班輪:

awk 'BEGIN { FS=OFS=";" } NR==1 { r = $2 FS $5; next } { !x[$1]; a[$2,$5][$1]=$3 } END { m = asorti(x,y); for (k=1;k<=m;k++) { r = r FS y[k] } print r; n = asorti(a,b); for (i=1;i<=n;i++) { for (j=1;j<=m;j++) { for (k in a[b[i]]) { if (k == y[j]) { var = a[b[i]][k] } } line = line FS var; var = "" } sub(SUBSEP, FS, b[i]); print b[i] line; line = "" } }' file

結果:

TimeString;Time_ms;A;B;C;D
23.11.201215:03:53;41236627696,7593;1;;2;3
23.11.201215:04:53;41236628391,2037;31;12;1;
23.11.201215:05:53;41236629097,2222;;7;15;8


您需要先dos2unix在文件上執行。IE:

dos2unix Flussi0.csv

或者,將記錄分隔符更改為\r\n以便awk知道 Windows 換行符結尾的樣子。您可以在BEGIN塊中執行此操作:

BEGIN {
   FS=OFS=";"
   RS="\r\n"
}

輸入文件的結果發佈在下面的評論中:

"TimeString";"Time_ms";"FIT01";"FIT02";"FIT03";"FIT04";"FIT05";"FIT06"
"22.06.2012 09:31:33";41082396909,7222;1,157408E-02;5,787041E-03;2,507718E-02;2,89352E-03;2,314816E-02;5,787035E-04
"22.06.2012 09:32:34";41082397615,7407;1,157408E-02;5,787041E-03;2,314816E-02;2,89352E-03;2,713479E-02;5,787035E-04
"22.06.2012 09:33:35";41082398321,7593;1,157408E-02;5,787041E-03;2,314816E-02;2,89352E-03;2,314816E-02;5,787035E-04
"22.06.2012 09:34:35";41082399016,2037;1,157408E-02;5,787041E-03;2,314816E-02;2,89352E-03;2,535274E-02;5,787035E-04
"22.06.2012 09:35:36";41082399722,2222;;;;;2,314816E-02;

引用自:https://unix.stackexchange.com/questions/61003