次のファイルがあります。
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
}