Him*_*aul 2 shell awk fortran if-statement
我有一个包含数字的文件,例如1到300.但数字不是连续的.示例文件如下所示
042
043
044
045
078
198
199
200
201
202
203
212
213
214
215
238
239
240
241
242
256
257
258
Run Code Online (Sandbox Code Playgroud)
现在我需要检查数字序列的连续性,并相应地写出输出.例如,前4个数字是串联的,因此输出应该是
042-045
Run Code Online (Sandbox Code Playgroud)
接下来,078是一个单独的数字,所以输出应该是
078
Run Code Online (Sandbox Code Playgroud)
为方便起见,它可以看起来像
078-078
Run Code Online (Sandbox Code Playgroud)
然后198到203是连续的.所以,下一个输出应该是
198-203
Run Code Online (Sandbox Code Playgroud)
等等.最终的输出应该是这样的
042-045
078-078
198-203
212-215
238-242
256-258
Run Code Online (Sandbox Code Playgroud)
我只需要知道连续系列的第一个和最后一个成员,并在遇到不连续时跳到下一个系列; 输出可以被操纵.我倾向于使用if语句,可以想到像这样复杂的事情
num=`cat file | wc -l`
out1=`head -1 file`
for ((i=2;i<=$num;i++))
do
j=`echo $i-1 | bc`
var1=`cat file | awk 'NR='$j'{print}'`
var2=`cat file | awk 'NR='$i'{print}'`
var3=`echo $var2 - $var1 | bc`
if [ $var3 -gt 1 ]
then
out2=$var1
echo $out1-$out2
out1=$var2
fi
done
Run Code Online (Sandbox Code Playgroud)
虽然有效,但过于冗长.我相信这样做肯定有一个简短的方法.我也对shell,awk或几行fortran代码中的其他直接命令(或几个命令)开放.
感谢你在期待.
这个awk one-liner适用于给定的例子:
awk 'p+1!=$1{printf "%s%s--",NR==1?"":p"\n",$1}{p=$1}END{print $1}' file
Run Code Online (Sandbox Code Playgroud)
它为您的数据提供输出:
042--045
078--078
198--203
212--215
238--242
256--258
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
84 次 |
| 最近记录: |