次のタブ区切り形式で生成されたレポートがあります。
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
。これは、すべてのフィールド$ 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
しますprint
。すべての出力ラインを再フォーマットする必要があるため、答えはこれを変更しませんでした。