Awk

將數據行移動到單列,同時保留行標題

  • August 20, 2018

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

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 腳本中。因此條目的數量將始終相同,報告不會更改。

嘗試:

$ 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

oneliner 破碎成碎片:

將製表符設置為輸入文件的欄位分隔符:

BEGIN { FS="\t" }

如果第一行 ( NR==1) 將其拆分為欄位並將它們儲存在數組中header。這個 simpy 比複製所有欄位要短 $ 1, $ 2, … 在一個 for 循環中並儲存它們。該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使用欄位之間的選項卡。我沒有在答案中更改這一點,因為它也需要重新格式化所有輸出行。

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