Awk
將數據行移動到單列,同時保留行標題
我有以以下製表符分隔格式生成的報告:
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"
在塊中設置BEGIN
將