Files

重塑製表符分隔文件

  • May 25, 2021

我有一個看起來像這樣的文件:

Time   Flag
0.65   5.885581e-01
0.56   5.847484e-01
0.58   5.278409e-01
0.57   1.140746e+00
1.00   0
0.00   0
1.00   1
0.00   0

但這是因為我在寫的時候忘了轉置一些東西。因此,一半的時間最終出現在標誌列中,而一半的標誌最終出現在時間列中。應該是

Time Flag
0.65   1
0.59   0
0.56   0
0.58   0
0.58   1
0.53   1
0.57   0
1.14   0

所以在這個小例子中,前四行應該成為第一列。最後四行應該成為第二列。請注意,每列中的一半元素已經在原始文件中正確格式化(以交替方式)。重塑和重新格式化它的最簡單方法是什麼?

$ awk 'NR > 1 { d[++n] = $1; d[++n] = $2 } END { print "Time", "Flag"; for (i = 1; 2*i <= n; ++i) printf "%.2f%s%d%s", d[i], OFS, d[n/2 + i], ORS }' file
Time Flag
0.65 1
0.59 0
0.56 0
0.58 0
0.58 1
0.53 1
0.57 0
1.14 0

awk程式碼將所有數據逐行讀取到d數組中的連續元素中(跳過標題)。

在該END塊中,列印標題,然後我們從 1 到數組i長度的一半進行迭代,列印 index 處的值(時間值)和 at (標誌值)。完成輸出的格式化,以便將時間值列印為帶兩位小數的浮點值,並將標誌值列印為整數。d``i``n/2 + i

和變數保存預設輸出欄位OFSORS記錄分隔符(預設為空格和換行符)。對於製表符分隔的輸出,使用awk -v OFS='\t' '{ ... }' file.

作為參考,awk作為獨立腳本的程式碼:

#!/usr/bin/awk -f

NR > 1 {
   d[++n] = $1
   d[++n] = $2
}

END {
   print "Time", "Flag"

   for (i = 1; 2*i <= n; ++i)
       printf "%.2f%s%d%s", d[i], OFS, d[n/2 + i], ORS
}

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