如何提取文件之间的行&;使用linux shell命令读取字符串的一部分?

如何提取文件之间的行&;使用linux shell命令读取字符串的一部分?,linux,bash,shell,Linux,Bash,Shell,我有以下字符串(比如string1),如下所示: 194 730 178 464 162 855 20130403012319 0 $GPRMC,012319.000,A,5055.1987,N,00624.5035,E,0.01,0.00030413,A*63 我发现字符串长度为80 现在我想从上面的字符串中提取4个元素,如下所示 20130403 012319 50+(55.1987/60) 006+(24.5035/60.0) 我知道sed和awk将完成我的任务,但我不确定如何从单个字

我有以下字符串(比如string1),如下所示:

194 730 178 464 162 855
20130403012319 0 $GPRMC,012319.000,A,5055.1987,N,00624.5035,E,0.01,0.00030413,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”的线索引?同时,我需要跨越每个“string1”的前后5个“string2”(即总共10个),以平均从“string2”提取的第5个元素。你能给我举个粗略的例子来说明逻辑吗

最后,我想合并从string1和string2提取的元素,如下所示:

194 730 178 464 162 855
20130403 012319 50+(55.1987/60)006+(24.5035/60.0)xxx

式中,xxx是在每个“string1”之前(5个)和之后(5个)出现的“string2”第5个元素的平均值

这是我必须为整个文件做的,并用上面提取的数据写入一个新文件。请提供一些建议和必要的命令,并举例说明


谢谢你的评论


这就是我尝试过的


#/bin/bash
清楚的
#查找目录中的文件数
nfiles=`find./*.bin-type f | wc-l`
echo$n文件
#按顺序读取文件
对于*.bin中的文件;做
FILENAME=$file;
echo“正在处理$FILENAME…”
#awk'{if(length($0)>=79)打印编号,“,”,$0}'$FILENAME>testresult.txt
#sed's/,/g'testresult\u sed.txt
awk'{if(length($0)>=79)print NR,“,”,$0}'$FILENAME | sed's/,/g'>testresult_sed.txt
行=`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}'`
数组_行=($行)
数组_时间=($time)
数组_lat=($lat)
数组_lon=($lon)
数组_date=($date)
计数=${#数组_行[@]}
对于'seq 1$count'中的i;做
idx=$($i-1))
(i-1)1)月7日{{{阵列时间[$(i-1)(1-1)(1-1)(1-1)(1-1)(1-1)(1-1(1-1)(1-1)(1-1)(1-1)(1-1)(1-1)(1-1)(1-1)(1-1)(1)(1-1)(1-1)(1)1)月1)日)5)月5)日{{{{{{{{阵列时间[阵列阵列阵列时间[5(2(5)(5)(5)(5)(5)(5)(5)(1-1-5)(5)(5)(5)(1-1-1-5)(5)(5)(1-1(1-1-1)(5)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(1)(U行[$idx]}+5]“!d”<$FILENAME | awk'{print$5}”`
完成>测试.txt
完成

我成功地写下了我想看的东西。但我仍然看到我的“lat”和“lon”由5055.1987和00624.5035表示。我想写50+(55.1987/60)和006+(24.5035/60)的结果值。如何将其作为代码的一部分?有人能提出更好的方法来修改我的代码以加快计算速度吗

你好,约翰


是,“string1”是GPS输出。实际上,该GPS设备与上面“string2”表示的其他仪器测量值相连。我已经用MATLAB和IDL编写了代码,但是我有巨大的数据文件,每一个文件都包含超过6000000行。每个文件由5-6天的连续数据组成。GPS每1秒提供一次数据,而其他连接的仪器每100毫秒(即0.1秒)提供一次数据。所以,我想获得以GPS记录为中心的仪器数据。对于每个GPS记录,其他仪器的5次以上和5次以下测量取平均值。我可以知道是否有比bash脚本更简单的方法来执行此处理吗?我发现bash脚本大大减少了计算时间,但如果存在的话,我愿意尝试其他更简单的方法

我想你首先需要解释一下如何从这个“20130403012319 0$GPRMC,012319.000,A,5055.1987,N,00624.5035,E,0.01,0.00030413,,,A*63”中提取这个“20130403012319 50+(55.1987/60)006+(24.5035/60.0)”。这一点不清楚。请显示您迄今为止所做的尝试。
awk-F,{print$3,$3+$4,$6-$9}文件
可能会为您提供一个起点。阅读awk教程,然后编辑您的问题以包含您遇到问题的代码。我们不是来为你编程的。祝你好运。这是我尝试过的…@m0skit0这看起来像是GPS或其他设备的输出。Madhavan,我想用bash以外的东西来解析这个可能会更容易。。。