stdout을 분할하여 여러 출력 파일로 이동하는 방법은 무엇입니까?


12

commandstdout에 많은 수의 행을 인쇄 하는 명령 이 있다고 가정 해보십시오.

line1
line2
.....
lineN

출력을 디스크에 저장하려고하지만 단일 파일이 아니라 각각 1000 줄의 stdout을 갖는 일련의 파일로 저장하려고합니다.

file0001.txt:
-------------
line1
....
line1000

file0002.txt:
-------------
line1001
....
line2000

etc

나는 대답을 구글하려고 시도했지만 구글이 나를 tee명령 할 때 마다이 상황에서는 쓸모가 없다. 아마 잘못된 쿼리를 입력하고 있습니다.

답변:


24

파일 저장을 마친 후에는 항상 줄 수에 split따라 파일을 여러 개의 파일 또는 여러 개의 파일로 만들 수 있습니다.

split -l 1000 output_file

또는 더 나은 시도

command | split -l 1000 -

이것은 출력 스트림을 1000 줄마다 파일로 분할합니다 (기본값은 -l 옵션이없는 1000 줄).

아래 명령을 사용하면 출력을 생성하고 파일에 저장하기 위해 분할 할 때 생성되는 파일 이름에 접두사를 추가하거나 적용 할 수있는 추가 유연성이 제공됩니다.

command | split -l 1000 - small-


그래서 그 다른 사람을 위해, 혼란있어 split [arguments...] [input e.g. "-" for stdin] [output_prefix]: 예를 들어 tar -c somedir | split --byes 100MB --numeric-suffixes --suffix-length=3 - somedir.tar.part-출력 인 100MB 무리라는 파일 것 somedir.tar.part-000, 001, 등 002 ANS.
— ThorSummoner

3

bash 스크립트를 사용할 수 있습니다 lines.bash

#!/bin/bash
a=0
while IFS='' read -r line
do
  printf -v filename "%04d.txt" "$((a++/1000))"
  echo "$line" >> $filename
done

그것을 다음과 같이 사용하십시오 :

cat long_file.txt | bash lines.bash

내가 발견 한 유일한 문제는 *로그인과 관련된 것입니다 long_file.txt(누군가 수정할 수 있음).


2
IFS단어가 분리되지 않도록를 빈 문자열로 설정하십시오 read. 에 -r백 슬래시 이스케이프를 비활성화하는 데 사용합니다 read. -e백 슬래시 이스케이프 방지를 위해 제거하십시오 echo. 따옴표를 사용하여 단어가 분리되지 않도록하십시오 echo. 사용 -v에 bash하위 프로세스를 시작하지 않도록부터 4.0. 현재 코드가 첫 번째 파일에 999 줄만 넣을 것이기 때문에 후행 증가를 사용하십시오. a=0; while IFS='' read -r line; do printf -v filename "%04d.txt" $((a++/1000)); echo "$line" >> "$filename"; done
— manatwork

@manatwork 감사합니다. 오직 내 스위치 printf가 없습니다 -v. ( bash 4.2.10). 적어도 그것의 맨 페이지에없는printf
— xralf

1
man printf결코 환경 변수를 설정할 수없는 문서 / usr / bin / printf. 참조 help printf을 위해 printf내장 된 쉘의 설명서를 참조하십시오.
— manatwork

@manatwork OK. ++/아직 부분에 구문 오류가있는 것 같습니다 .
— xralf

1
한 가지 더 : 매개 변수 확장이 명시 적으로 필요하지 않은 경우 산술 평가 내부에서 sigil을 사용할 필요가 없습니다. 산술 확장에서는 변수가 평가됩니다.
— manatwork
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.