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. 사용 -vbash하위 프로세스를 시작하지 않도록부터 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.