Python 327p;。。。;20620663P;2070820745P'

Python 327p;。。。;20620663P;2070820745P',python,perl,bash,awk,sed,Python,Perl,Bash,Awk,Sed,由于SO问题的错误而编辑 使用模肯定是最好的方法。这个问题的原始想法是由@rici 不幸的是,SO问题是错误的:…从82-163行(包括在内),而不是从164-245行,我计算的是82行,而不是81行 首先,我只想提供我的+替代解决方案 但现在更正了,为了更好地匹配SO问题,这可能有助于显示错误的位置: sed -nf <(for ((i=0;i<20736;i+=82));do echo $((i+44)),$(($i+81))p;done ) < file 做 (Nota

由于SO问题的错误而编辑

使用模肯定是最好的方法。这个问题的原始想法是由@rici

不幸的是,SO问题是错误的:…从82-163行(包括在内),而不是从164-245行,我计算的是82行,而不是81行

首先,我只想提供我的
+
替代解决方案

但现在更正了,为了更好地匹配SO问题,这可能有助于显示错误的位置:

sed -nf <(for ((i=0;i<20736;i+=82));do echo $((i+44)),$(($i+81))p;done ) < file

Nota:此匹配与SO问题样本完全匹配,但不要以20736结尾

   echo $((20746000/82))
   253000
如果它代表分子,那么在20736行中只有252个完整的分子。)

因此
sed
脚本可以通过以下方式编写:

sed -ne '44,81p;126,163p;208,245p;290,327p;...;20626,20663p;20708,20745p' <file

sed-ne'44,81p;126163P;208245P;290327P;。。。;20620663P;2070820745p'使用@rici的模思想的简单perl:

perl -ne 'print if $.%82>43' file

使用@rici的模思想的简单perl:

perl -ne 'print if $.%82>43' file
通过使用模运算符具有正确的想法,但随着记录的增加,其解决方案逐渐变得不同步,如下所示:

$ seq 350 | awk  '(NR-1)%81==43{printf "%i",$0} (NR-1)%81==80{print " -",$0}' 
44 - 81                         # In sync
125 - 162                       # Out of sync by 1 
206 - 243                       # Out of sync by 2 
287 - 324                       # Out of sync by 3 
要打印您请求的行,请执行以下操作:

$ awk 'NR%82>43' file
印刷范围包括:

$ seq 350 | awk  'NR%82==44{printf "%i",$0} NR%82==81{print " -",$0}'
44 - 81
126 - 163
208 - 245
290 - 327
用以下方法测试自己:

$ seq 350 | awk  'NR%82>43'
通过使用模运算符具有正确的想法,但随着记录的增加,其解决方案逐渐变得不同步,如下所示:

$ seq 350 | awk  '(NR-1)%81==43{printf "%i",$0} (NR-1)%81==80{print " -",$0}' 
44 - 81                         # In sync
125 - 162                       # Out of sync by 1 
206 - 243                       # Out of sync by 2 
287 - 324                       # Out of sync by 3 
要打印您请求的行,请执行以下操作:

$ awk 'NR%82>43' file
印刷范围包括:

$ seq 350 | awk  'NR%82==44{printf "%i",$0} NR%82==81{print " -",$0}'
44 - 81
126 - 163
208 - 245
290 - 327
用以下方法测试自己:

$ seq 350 | awk  'NR%82>43'



好吧,开始写Python吧,我们不是为你写的。@sudo_O:好吧,我明白错在哪里:第一个必须从
0
开始,因为
163-82=81
245-164=81
81-0=81
,而不是
81-1
@维杰:你的示例行范围与你的问题不一致。如果你继续这些例子直到第256个分子,你的范围是20954-20991,但是你声称文件中只有20736行。亲爱的@rici,你是对的。我在文件中每81行就漏掉一次关于行分隔符的内容。对此表示歉意。@Vijay:请更正您的帖子:不可能有
20736
256
分子和
81+1
行+sep。我们开始编写Python吧,我们不为您这么做。@sudo_O:好的,我明白错在哪里:第一个必须从
0
开始,因为
163-82=81
245-164=81
81-0=81
,而不是
81-1
@维杰:你的示例行范围与你的问题不一致。如果你继续这些例子直到第256个分子,你的范围是20954-20991,但是你声称文件中只有20736行。亲爱的@rici,你是对的。我在文件中每81行就漏掉一次关于行分隔符的内容。对此深表歉意。@Vijay:请更正您的帖子:不可能有
20736
256
分子和
81+1
行+九月。谢谢您的帮助。但是当我运行时,我没有任何输出。屏幕似乎只有在运行完成后才会显示空白。你现在可以试试吗?当我们没有文件时,这会有些困难。@jotne除了方法错误之外,你的答案还有很多错误。如果您想使用
seq
来测试输入文件,以生成一个int列表。我确实删除了一个用于测试的
a
额外文件。逻辑是正确的。行
1
给出字段
44-81
,行
2
字段
44-81
,然后行
82到163
打印字段
126到163
等OP不要求拆分字段,他只希望打印行44-81、126163等。感谢您的帮助。但是当我运行时,我没有任何输出。屏幕似乎只有在运行完成后才会显示空白。你现在可以试试吗?当我们没有文件时,这会有些困难。@jotne除了方法错误之外,你的答案还有很多错误。如果您想使用
seq
来测试输入文件,以生成一个int列表。我确实删除了一个用于测试的
a
额外文件。逻辑是正确的。行
1
给出字段
44-81
,行
2
字段
44-81
,然后行
82到163
打印字段
126到163
等OP不要求拆分字段,他只希望打印第44-81行、126163行等。如果有人投了否决票,我认为他/她还应该抽出一些时间让我知道为什么要这样做,以便我可以改进它。这可能被否决了,因为您的解决方案是查看
head
命令。你能建议一下
head
命令在这里有什么帮助吗?@sudo\u O:谢谢你指出我的错误。我应该提到“head”和“tail”命令的组合;我只提到一个。我会更正它。但是,您如何在一个文件中打印多个范围?如果我们已经有了范围,我们不能将它们作为参数传递,并以两个(最小值和最大值)为一组进行处理吗?我想实现这一点还需要几行代码。如果有人投反对票,我想他/她也应该抽出一些时间让我知道为什么这样做,以便我可以改进。这可能是因为你的解决方案是查看
head
命令。你能建议一下
head
命令在这里有什么帮助吗?@sudo\u O:谢谢你指出我的错误。我应该提到“head”和“tail”命令的组合;我只提到一个。我会更正它。但是,您如何在一个文件中打印多个范围?如果我们已经有了范围,我们不能将它们作为参数传递,并以两个(最小值和最大值)为一组进行处理吗?我想实现这一点还需要几行代码。我不认为是运算算术错误。请参阅我的答案@rici Care:SO问题是错误的:第一步必须从
0
开始,而不是
1
@如果这是真的,每个分子将有82条线;问题是81。另外,问题是有20736行
perl -ne '
  BEGIN{ ($f,$t)=(44,81) }
  ($.==$f .. $.==$t) =~ /(E0|.)$/ or next;
  print;
  $1 eq "E0" or next;
  $_ += 82 for $f,$t;
' file
perl -ne 'print if $.%82>43' file
$ seq 350 | awk  '(NR-1)%81==43{printf "%i",$0} (NR-1)%81==80{print " -",$0}' 
44 - 81                         # In sync
125 - 162                       # Out of sync by 1 
206 - 243                       # Out of sync by 2 
287 - 324                       # Out of sync by 3 
$ awk 'NR%82>43' file
$ seq 350 | awk  'NR%82==44{printf "%i",$0} NR%82==81{print " -",$0}'
44 - 81
126 - 163
208 - 245
290 - 327
$ seq 350 | awk  'NR%82>43'