여기에 문서 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