BASHを使用してCSVファイルの別の列に.txtファイルデータを保存する方法は?

BASHを使用してCSVファイルの別の列に.txtファイルデータを保存する方法は?

次のデータ構造を持つ.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ファイルを生成します。trimbatch[Z]join()

[注:batch演算子は不完全な配置に対して機能します。完全なバッチのみが必要な場合はrotor代わりにbatch.を使用してください(ただし、rotor設定しないと不完全なバッチでは自動的に失敗します:partial)。

" seconds"次に削除第二下のRakuの1行(...またはsubst()追加最初上記の行):

perl6 -pe 's:g/" seconds"//;' 

https://raku.org/

関連情報