파일을 분할하고 출력 파일의 접두사를 대체하는 방법은 무엇입니까?

파일을 분할하고 출력 파일의 접두사를 대체하는 방법은 무엇입니까?

큰 파일이 있습니다. 각 섹션은 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}XY


요구 사항이 변경되었으므로 대체 이름을 사용하여 여러 부분으로 분할하면 됩니다 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라인마다 prefix가 로 변경되고 Y, 80라인마다 prefix가 로 변경되고 X카운터 c가 증가합니다.

관련 정보