큰 파일이 있습니다. 각 섹션은 40줄로 구성됩니다. 두 가지 유형의 부품이 있으며 교대로 사용됩니다. 두 가지 유형의 부품 모두 독립적으로 번호를 매겨야 합니다. 따라서 첫 번째 부분은 이어야 하고 X_0001
, 두 번째 부분은 이어야 하며 Y_0001
, X_0002
그런 Y_0002
다음 이어야 합니다.
이 명령을 사용했지만 동일한 접두사가 있는 부분으로만 분할됩니다.
split -d -l 40 -a 4 inputfile X_
답변1
split
한 가지 방법은 사실 이후에 파일을 사용하고 이름을 바꾸는 것입니다 .
하지만 아마도 가장 쉬운 방법은 awk를 호출하는 것입니다. >
리디렉션 연산자를 사용하여 표준 출력 대신 파일에 쓸 수 있습니다 . 이 변수 NR
에는 현재 줄 번호가 포함됩니다.
Awk의 리디렉션은 자동으로 파일 열기를 처리합니다. 다양한 파일을 사용하여 작업하는 경우 해당 파일을 명시적으로 닫아야 합니다. 그렇지 않으면 열려 있는 파일에 제한이 생길 수 있습니다.
awk '
(NR-1) % 40 == 0 { close(out); out = sprintf("%s_%04d", (NR % 80 == 1 ? "X" : "Y"), NR/80+1); }
{ print >out }
' inputfile
답변2
gnu split
다음 옵션을 사용할 수 있습니다 --filter
.
split --numeric-suffixes=0001 -l 80 -a 4 \
--filter='sed -n -e "1,40w $FILE" -e "41,80w ${FILE/X/Y}"' infile X_
이렇게 하면 파일이 80줄 조각으로 분할되어 sed
처음 40줄이 각 조각의 콘텐츠 $FILE
(이 경우 조각 이름은 - see split
로 대체됨 )로 파이프되고 나머지 콘텐츠는 이름은 같지만 대신 를 사용합니다 .X_????
man split
${FILE/X/Y}
X
Y
요구 사항이 변경되었으므로 대체 이름을 사용하여 여러 부분으로 분할하면 됩니다 awk
. 다음을 사용할 수도 있습니다.
awk 'BEGIN{c=1;p="X"}
{close(fn);fn=sprintf("%s_%04d", p, c);print >> fn}
NR%40==0{p="Y"}NR%80==0{p="X";c++}' file1
p
이는 두 개의 변수 refix 및 counterer를 기반으로 조각 이름을 설정합니다 c
. 40라인마다 p
refix가 로 변경되고 Y
, 80라인마다 p
refix가 로 변경되고 X
카운터 c
가 증가합니다.