我这里有文档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