【发布时间】:2017-03-01 07:29:28
【问题描述】:
我有多个文本文件,其中的标题为每个变量命名。这些变量通常命名为“FCCXX102@PV”或类似名称。
我正在尝试将每一列与包含时间戳的第一列分开到它们自己的文件中。
此脚本尝试将两列分隔为一个 tmp.txt 文件,然后将 2 列文件重命名为与上述变量名称相对应。例子。 FCCXX102@PV.csv
#!/bin/bash
str=ColCount
str2=Total
total=0
for f in ../data/*.txt
do
colcount=$(head -n 1 $f | grep -o "," | wc -l)
echo $str $colcount
total=$((colcount + total))
echo $str2 $total
i=1
echo I $i
while [ $i -le $colcount ];do
cut -d',' -f1,$((i+1)) $f > ../tag_data/tmp.txt
tagname="$(head -n 1 ../tag_data/tmp.txt | cut -d',' -f2)"
echo $tagname
mv ../tag/tmp.txt ../tag_data/$tagname".csv"
i=$((i+1))
echo I $i
done
done
第一个 tmp.txt 文件显示得非常快。错误是唯一显示的文件以数字 5FIXXX 或 100VXXXX@PV.csv 等开头。而且写入这些文件的速度很慢,所以我觉得我在某处的 while 循环中出错了。
我的代码是否以某种方式排除了以字母开头的变量?
是否有更快或更简单的方法来执行此操作?我总共有 ~1300 个变量,每个文本文件中有 100 万行。
如果尝试使用标记名:
tagname="$( cat tmp.txt | grep time | cut -d',' -f 2| awk'{print $1}')
【问题讨论】:
-
您输入的内容是什么样的?如果您提供示例输入和预期输出,看起来整个事情都可以在 awk 中完成
-
bash 不是一种文本处理语言,请使用正确的工具。
-
@n.m.感谢您的回复,您能推荐一个更合适的技术吗?
-
@muru 明天早上我会看看我是否可以将前 5 行显示出来。上面的脚本试图在一夜之间运行,但我不确定它会完成