我有一个 data.csv 文件,我想将其转换为 txt,然后找出其中包含多少个偶数:
我的 data.csv 是这样的:
# Recorded data from sensor XaB.v2
# Recording started on Oct 29 15:00:00
# Recording ended on Oct 29 15:15:59
# X, Y, Z, X', Y', Z'
55, 14, 48, 62, 78, 41
32, 52, 94, 11, 17, 83
等等。
我试过这种方法,但也许有更好的方法
grep -v '^#' data.csv | sed -e 's/,//g' > data.txt
grep -o '[0-9]\+' data.txt | awk '$1%2 == 0' | wc -l
特别是 sed 命令,我不知道这是否是最佳方法。
然后我必须创建 n 个 data.txt 副本,并将缩放值除以 i,我再次尝试使用此脚本,但我不知道是否有更简单、更干净的方法来做到这一点:
n=$1
for ((i=1; i<=n; i++)) do
awk -v divisor="$i" '{ for (j=1; j<=NF; j++) printf "%.6f", $j / divisor; print "" }' data.txt > "data_${i}.txt"
done
我没有在此代码片段中包含必要的检查(语法和 n 作为正整数)。
您可以使用
awk
来计算偶数。在awk
脚本中使用条件来过滤掉注释行,而不是从 中进行管道传输sed
。GNU 的最新版本
awk
可以解析 CSV 格式(-k
或--csv
选项)。对于第一个目标(计数偶数值):对于第二个目标,我们也可以让
awk
最外层循环运行:(添加空格来分隔输出值)。请注意,使用像这样的简单 CSV(没有多行字段,没有带逗号的引号字段...),即使使用旧版本或非 GNU 版本的
awk
,如 Barmar 的回答中所示,我们也可以使用-F ','
并获得与 相同的结果-k
。关于这个特定的用法
sed
,你可以用更具体的工具来代替它,即按照tr
以下方式不过,它在你的代码片段中是多余的。2n grep 确实提取了一个或多个数字,数字可能会被一个或多个非数字字符剪切。实施此更改后,你的代码将变为
你不需要 wc,因为 GNU
awk
可以用来计算自身,即如果条件成立,则 cnt 增加 1,并且在处理(at
END
)print
ed 之后,+0
如果条件从未满足,则使用它来强制执行数字。在大多数情况下,你不需要在
awk
命令前使用 grep,在你的情况下我告诉 GNU AWK,该字段由一个或多个数字组成
FPAT
,并使用for
循环循环遍历每行的字段。在大多数情况下,你不需要在
awk
命令前使用 grep,在你的情况下我添加了以 # 字符开头的
!/^#/
行以排除(!
否定)。(在 GNU Awk 5.3.1 中测试)