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