次のデータ構造を持つ.txtファイルがあります。
Scan Times:
33.3 seconds
77.4 seconds
33.3 seconds
77.4 seconds
Check Times:
110.30 seconds
72.99 seconds
72.16 seconds
110.30 seconds
Move Times:
73.66 seconds
90.77 seconds
72.87 seconds
71.75 seconds
Switch Times:
92.0 seconds
78.6 seconds
77.8 seconds
84.9 seconds
次に、対応する.txtファイルをインポートして、次の形式のCSVファイルを作成したいと思います。
これまでのところ、私のbashスクリプトは非常に基本的なレイアウトを持っていますが、進行方法がわかりません。
inputFiles=("./Successes/SuccessSummary.txt" "./Failures/FailSummary.txt")
touch results.csv
for file in "${inputFiles[@]}"
do
while IFS= read -r line
do
#echo $line
if [ "$line" = "Scan Times:" ]
then
fi
if [ "$line" = "Check Times:" ]
then
fi
if [ "$line" = "Move Times:" ]
then
fi
if [ "$line" = "Switch Distances:" ]
then
fi
done < "$file"
done
答え1
pr -4T file
Scan Times: Check Times: Move Times: Switch Times:
33.3 seconds 110.30 seconds 73.66 seconds 92.0 seconds
77.4 seconds 72.99 seconds 90.77 seconds 78.6 seconds
33.3 seconds 72.16 seconds 72.87 seconds 77.8 seconds
77.4 seconds 110.30 seconds 71.75 seconds 84.9 seconds
各列の空行も表示されます。
以前は、次のようにテキストを必要に応じて変更できましたsed
。
sed '/^\s*$/d;s/seconds//' file | pr -4T
Scan Times: Check Times: Move Times: Switch Times:
33.3 110.30 73.66 92.0
77.4 72.99 90.77 78.6
33.3 72.16 72.87 77.8
77.4 110.30 71.75 84.9
付録:
このユーティリティは印刷用に作成されており、この状況に適していない基本的なフラグがたくさんあることを覚えておく必要があります。
-T
ページ付けを削除し、ヘッダーとフッターを省略します。
-wN
ページの幅を設定します。 (基本: -w 72
)。
追加2:
または各行を配列に書き込む方法の例awk
:
awk '
/^\s*$/ {i=0; next}
{A[i]= A[++i] sprintf("%*s", 12,$($NF ~ /:$/?0:1))}
END {for(i in A) print A[i]}
' file
Scan Times:Check Times: Move Times:Switch Times:
33.3 110.30 73.66 92.0
77.4 72.99 90.77 78.6
33.3 72.16 72.87 77.8
77.4 110.30 71.75 84.9
答え2
Raku(以前のPerl_6)の使用:
raku -e '.join("\t").put for [Z] lines.map(*.trim).batch(6);'
出力:
Scan Times: Check Times: Move Times: Switch Times:
33.3 seconds 110.30 seconds 73.66 seconds 92.0 seconds
77.4 seconds 72.99 seconds 90.77 seconds 78.6 seconds
33.3 seconds 72.16 seconds 72.87 seconds 77.8 seconds
77.4 seconds 110.30 seconds 71.75 seconds 84.9 seconds
簡単に言うと、-med(要素ごと)と-ed(通常)は列の長さ(6)に基づいてlines
行われ、4つのバッチが作成されました。その後、演算子は各バッチで1つの要素を連続的に「圧縮」する。最終書式設定ステップでは、要素をタブと組み合わせてTSVファイルを生成します。trim
batch
[Z]
join()
[注:batch
演算子は不完全な配置に対して機能します。完全なバッチのみが必要な場合はrotor
代わりにbatch
.を使用してください(ただし、rotor
設定しないと不完全なバッチでは自動的に失敗します:partial
)。
" seconds"
次に削除第二下のRakuの1行(...またはsubst()
追加最初上記の行):
perl6 -pe 's:g/" seconds"//;'