在非常大的文档的每 n 行上剪切字符串

在非常大的文档的每 n 行上剪切字符串

我这里有文档A:

@rand1
ABCDEFBHIJKLM
+
<</////
@rand2
NOPQRSTUVW
+
<<//<<<
@anotherrand
XYZABCDE
+
<<//<<<

我想要一个包含文档 A 的所有行的输出,但其中第 2,6,10... 行(模式为 2+n*4)已被修剪为仅包含前 3 个字符。这个输出看起来像这样:

@rand1
ABC
+
<</////
@rand2
NOP
+
<<//<<<
@anotherrand
XYZ
+
<<//<<<

我正在一个非常大的文件(> 1000 万行)上执行此操作,并且似乎无法找到一种方法来使其快速执行。下面的代码实现了我想要的,但花费的时间太长:

r=0 #line number of documentA being read
l=2 #line that needs to be trimmed

while read line; do
  r=$(echo $r +1 | bc)
  echo $r
  if [ $r == $l ]
  then
    echo $line | cut -c -3 >> outputfile
    l=$(echo $l + 4 | bc)
  else
    echo $line >> outputfile
  fi
done < document A

答案1

对于 GNU sed(在 OSX 上可用gsed),使用“nskipm”地址运算符:

sed -E '2~4s/(.{3}).*/\1/' inputfile > outputfile

相关内容