タブ区切りファイルの外観の変更

タブ区切りファイルの外観の変更

次のファイルがあります。

 Time   Flag
 0.65   5.885581e-01
 0.56   5.847484e-01
 0.58   5.278409e-01
 0.57   1.140746e+00
 1.00   0
 0.00   0
 1.00   1
 0.00   0

しかし、それは私が書くときに何かを変えるのを忘れてしまったからです。したがって、タイミングの半分はフラグ列で終わり、フラグの半分は時間列で終わる。やらなければならなかった

 Time Flag
 0.65   1
 0.59   0
 0.56   0
 0.58   0
 0.58   1
 0.53   1
 0.57   0
 1.14   0

したがって、この小さな例では、最初の4行が最初の列になるはずです。最後の4行は2番目の列にする必要があります。各列の要素の半分は、元のファイルで正しい形式(交互)で指定されています。形を変えて型を変える最も簡単な方法は何ですか?

ベストアンサー1

$ awk 'NR > 1 { d[++n] = $1; d[++n] = $2 } END { print "Time", "Flag"; for (i = 1; 2*i <= n; ++i) printf "%.2f%s%d%s", d[i], OFS, d[n/2 + i], ORS }' file
Time Flag
0.65 1
0.59 0
0.56 0
0.58 0
0.58 1
0.53 1
0.57 0
1.14 0

このawkコードは、すべてのデータを行単位で読み取り、配列の連続要素として読み取りますd(ヘッダーをスキップ)。

ENDブロックからヘッダーが印刷され、次に1から配列の長さiの半分まで繰り返し、dインデックス(時間値)の値とマーク(フラグ値)iの値を印刷します。n/2 + i時間値が小数点以下の2桁の浮動小数点値で印刷され、フラグ値が整数で印刷されるように出力形式を完了します。

OFS変数にはORSデフォルトの出力フィールドとレコード区切り文字があります(デフォルトはスペースと改行)。タブ区切り出力の場合awk -v OFS='\t' '{ ... }' file

ちなみに、このawkコードはスタンドアロンスクリプトとして機能します。

#!/usr/bin/awk -f

NR > 1 {
    d[++n] = $1
    d[++n] = $2
}

END {
    print "Time", "Flag"

    for (i = 1; 2*i <= n; ++i)
        printf "%.2f%s%d%s", d[i], OFS, d[n/2 + i], ORS
}

おすすめ記事