我有以下字符串(比如string1),如下所示:
20130403,012319 0 $ GPRMC,012319.000,A,5055.1987,N,00624.5035,E,0.01,0.00,030413 ,,, A * 63
我发现字符串长度为80.
现在我想从上面的字符串中提取下面的4个元素。
20130403 012319 50+(55.1987/60) 006+(24.5035/60.0)
我知道sed和awk将完成我的任务,但我不确定如何从单个字符串中提取多个元素以及对其间提取的元素执行的数学运算(特别是对于第3和第4个元素)。谁能帮我?
另外,我有另一个字符串(比如string2),如下所示:
194 730 178 464 162 855
在这里,我将从文件中识别字符串中的单词数(= 6)。从这个字符串,我想提取第五个元素,即162.这可以很容易用awk(或)sed。但我遇到的问题有所不同:
在一个巨大的数据文件中,上述两个字符串都重复出现。例如,
..
..
string2
string2
string2
string2
string2
string1
string2
string2
string2
string2
string2
..
..
现在我的主要问题是:
如何从巨大的数据文件中识别所有'string1'的行索引?同时,我想要之前和之后在5'字符串2(即总共10)之后,跨越每个'string1'以平均从'string2'提取的第5个元素。你能用一些粗略的例子来建议我的逻辑吗?
最后,我想合并string1和amp;中提取的元素。 string2如下:
20130403 012319 50+(55.1987 / 60)006+(24.5035 / 60.0)xxx
其中xxx是'string2'之前发生的第5个元素的平均值(5个)&在(5个)每个'string1'之后。
这是我必须对整个文件执行的操作,并使用上面提取的数据写入新文件。请通过示例向我提供一些建议和必要的命令。
感谢您的评论...
这是我试过的......
#!/bin/bash
clear
# Find the number of files in a directory
nfiles=`find ./*.bin -type f |wc -l`
echo $nfiles
# Read the files sequentially
for file in *.bin; do
FILENAME=$file;
echo "Processing $FILENAME ..."
# awk '{if(length($0) >= 79) print NR,",",$0}' $FILENAME > testresult.txt
# sed 's/ /,/g' < testresult.txt > testresult_sed.txt
awk '{if(length($0) >= 79) print NR,",",$0}' $FILENAME | sed 's/ /,/g' > testresult_sed.txt
lines=`cat testresult_sed.txt | awk -F, '{print $1}'`
lat=`cat testresult_sed.txt | awk -F, '{print $10}'`
lon=`cat testresult_sed.txt | awk -F, '{print $12}'`
date=`cat testresult_sed.txt | awk -F, '{print $4}'`
time=`cat testresult_sed.txt | awk -F, '{print $5}'`
array_lines=($lines)
array_time=($time)
array_lat=($lat)
array_lon=($lon)
array_date=($date)
count=${#array_lines[@]}
for i in `seq 1 $count`; do
idx=$(($i-1))
echo ${array_lines[$(($i-1))]} ${array_date[$(($i-1))]} ${array_time[$(($i-1))]} ${array_lat[$(($i-1))]} ${array_lon[$(($i-1))]} `sed $((${array_lines[$idx]}-5))","$((${array_lines[$idx]}-1))"!d" < $FILENAME | awk '{print $5}'` `sed $((${array_lines[$idx]}+1))","$((${array_lines[$idx]}+5))"!d" < $FILENAME | awk '{print $5}'`
done > test.txt
done
我成功地写了我想看的东西。但我仍然看到我的'lat'和'lon'由5055.1987和00624.5035表示。我想把结果值写成50+(55.1987 / 60)和006+(24.5035 / 60)。我如何在代码中执行此操作?任何人都可以建议更好的方法来修改我的代码以加快计算速度吗?
你好约翰,
是'string1'是GPS输出。实际上,这个GPS设备附有上面用'string2'表示的其他仪器测量。我已经在MATLAB&amp; amp; IDL,但我有巨大的数据文件,每个文件包含6000000多行。每个文件包含5-6天的连续数据。 GPS每1秒提供一次数据,而另一个连接的仪器每100毫秒提供一次数据(即0.1秒)。所以,我想获得以GPS记录为中心的仪器数据。以上&amp;对于每个GPS记录,对另一个仪器的低于5的测量值进行平均。我是否知道是否有比bash脚本更简单的方法来执行此处理?我发现计算时间大大减少了bash脚本,但我想尝试其他更简单的方法,如果存在!