Files
重塑製表符分隔文件
我有一個看起來像這樣的文件:
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
和變數保存預設輸出欄位
OFS
和ORS
記錄分隔符(預設為空格和換行符)。對於製表符分隔的輸出,使用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 }