Python 327p;。。。;20620663P;2070820745P'
由于SO问题的错误而编辑 使用模肯定是最好的方法。这个问题的原始想法是由@rici 不幸的是,SO问题是错误的:…从82-163行(包括在内),而不是从164-245行,我计算的是82行,而不是81行 首先,我只想提供我的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问题,这可能有助于显示错误的位置:
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'