如何使用 BASH 将 .txt 文件数据存储在 CSV 文件的不同列中?

如何使用 BASH 将 .txt 文件数据存储在 CSV 文件的不同列中?

我有一个具有以下数据结构的 .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

简而言之,根据柱长 (6)lines进行trim-med(逐元素)和-ed(共同),产生 4 批。batch然后,[Z]操作员连续地将每批中的一个元素“压缩”在一起。在最后的格式化步骤中,元素join()与选项卡一起创建 TSV 文件。

[注:batch操作员将对不完整的批次进行操作;如果您只想要完整的批次,请使用rotor而不是batch. (但是,rotor除非您设置,否则将在不完整的最终批次上默默失败:partial)]。

" seconds"用删除第二下面的 Raku 一句台词,(...或添加subst()第一的上面一行):

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

https://raku.org/

相关内容