將資料行移至單列,同時保留行標題

將資料行移至單列,同時保留行標題

我有以以下製表符分隔格式產生的報告:

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"區塊中的設定BEGINprint在欄位之間使用製表符。我沒有在答案中更改它,因為它也需要重新格式化所有輸出行。

相關內容