매우 큰 문서의 n줄마다 문자열 자르기

매우 큰 문서의 n줄마다 문자열 자르기

여기에 문서 A가 있습니다.

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

문서 A의 모든 줄을 포함하는 출력을 원하지만 2,6,10...(패턴 2+n*4) 줄은 처음 3개 문자만 포함하도록 잘렸습니다. 출력은 다음과 같습니다.

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

나는 매우 큰 파일(>1천만 라인)에서 이 작업을 수행하고 있는데 이를 빠르게 만드는 방법을 찾을 수 없는 것 같습니다. 다음 코드는 내가 원하는 것을 달성하지만 시간이 너무 오래 걸립니다.

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

관련 정보