Bash

在非常大的文件的每第 n 行剪切字元串

  • August 28, 2019

我這裡有文件 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

使用 GNU sed(gsed在 OSX 上可用)使用“n skip m”地址運算符:

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

引用自:https://unix.stackexchange.com/questions/537919