
我有以以下製表符分隔格式產生的報告:
UNIT TC CC PC TCP FTX FRX
HOUSE 55 65 75 85 95 105
CAR 100 200 300 400 500 600
H2 5 10 15 20 25 30
C2 10 20 30 40 50 60
我需要將它們更改為以下格式:
HOUSE TC 55
HOUSE CC 65
HOUSE PC 75
HOUSE TCP 85
HOUSE FTX 95
HOUSE FRX 105
CAR TC 100
CAR CC 200
CAR PC 300
CAR TCP 400
CAR FTX 500
CAR FRX 600
等等。
我想使用標準工具,例如 SED AWK BASH,但歡迎任何建議。該程式碼將插入到一個 BASH 腳本中,我已經使用該腳本預先解析和連接資料。因此條目的數量將始終相同,並且報告不會改變。
答案1
嘗試:
$ awk 'BEGIN { FS="\t" } NR==1 { split($0,header,"\t") ; next } { for(i=2;i<=NF;i++) print $1,header[i],$i }' data
HOUSE TC 55
HOUSE CC 65
HOUSE PC 75
HOUSE TCP 85
HOUSE FTX 95
HOUSE FRX 105
CAR TC 100
CAR CC 200
CAR PC 300
CAR TCP 400
CAR FTX 500
CAR FRX 600
H2 TC 5
H2 CC 10
H2 PC 15
H2 TCP 20
H2 FTX 25
H2 FRX 30
C2 TC 10
C2 CC 20
C2 PC 30
C2 TCP 40
C2 FTX 50
C2 FRX 60
內襯碎成碎片:
將製表符設定為輸入檔案的欄位分隔符號:
BEGIN { FS="\t" }
如果第一行 ( NR==1
) 將其拆分為欄位並將它們儲存在陣列中header
。這個簡單比在 for 迴圈中複製所有欄位 $1, $2, ... 並儲存它們要短。此next
命令也阻止以下程式碼處理第 1 行,該程式碼僅適用於其他行。 (FS
而不是"\t"
會產生更嚴重的後果......)
NR==1 { split($0,header,"\t") ; next }
對於其他每一行 ( NR!=1
),列印$2...$NF
以 $1 為前綴的所有欄位 ( ) 和欄位名稱 ( header[i]
)。
{ for(i=2;i<=NF;i++) print $1,header[i],$i }
OFS=FS="\t"
區塊中的設定BEGIN
將print
在欄位之間使用製表符。我沒有在答案中更改它,因為它也需要重新格式化所有輸出行。