텍스트 파일을 여러 텍스트 파일로 분할하는 방법은 무엇입니까?

텍스트 파일을 여러 텍스트 파일로 분할하는 방법은 무엇입니까?

entry.txt다음 내용이 포함된 텍스트 파일이 있습니다 .

[ entry1 ]
1239 1240 1242 1391 1392 1394 1486 1487 1489 1600
1601 1603 1657 1658 1660 2075 2076 2078 2322 2323
2325 2740 2741 2743 3082 3083 3085 3291 3292 3294
3481 3482 3484 3633 3634 3636 3690 3691 3693 3766
3767 3769 4526 4527 4529 4583 4584 4586 4773 4774
4776 5153 5154 5156 5628 5629 5631
[ entry2 ]
1239 1240 1242 1391 1392 1394 1486 1487 1489 1600
1601 1603 1657 1658 1660 2075 2076 2078 2322 2323
2325 2740 2741 2743 3082 3083 3085 3291 3292 3294
3481 3482 3484 3690 3691 3693 3766 3767 3769 4526
4527 4529 4583 4584 4586 4773 4774 4776 5153 5154
5156 5628 5629 5631
[ entry3 ]
1239 1240 1242 1391 1392 1394 1486 1487 1489 1600
1601 1603 1657 1658 1660 2075 2076 2078 2322 2323
2325 2740 2741 2743 3082 3083 3085 3291 3292 3294
3481 3482 3484 3690 3691 3693 3766 3767 3769 4241
4242 4244 4526 4527 4529 4583 4584 4586 4773 4774
4776 5153 5154 5156 5495 5496 5498 5628 5629 5631

entry1.txt, entry2.txt, 세 개의 텍스트 파일로 분할하고 싶습니다 entry3.txt. 해당 내용은 다음과 같습니다.

항목1.txt:

[ entry1 ]
1239 1240 1242 1391 1392 1394 1486 1487 1489 1600
1601 1603 1657 1658 1660 2075 2076 2078 2322 2323
2325 2740 2741 2743 3082 3083 3085 3291 3292 3294
3481 3482 3484 3633 3634 3636 3690 3691 3693 3766
3767 3769 4526 4527 4529 4583 4584 4586 4773 4774
4776 5153 5154 5156 5628 5629 5631

항목 2.txt:

[ entry2 ]
1239 1240 1242 1391 1392 1394 1486 1487 1489 1600
1601 1603 1657 1658 1660 2075 2076 2078 2322 2323
2325 2740 2741 2743 3082 3083 3085 3291 3292 3294
3481 3482 3484 3690 3691 3693 3766 3767 3769 4526
4527 4529 4583 4584 4586 4773 4774 4776 5153 5154
5156 5628 5629 5631

항목 3.txt:

[ entry3 ]
1239 1240 1242 1391 1392 1394 1486 1487 1489 1600
1601 1603 1657 1658 1660 2075 2076 2078 2322 2323
2325 2740 2741 2743 3082 3083 3085 3291 3292 3294
3481 3482 3484 3690 3691 3693 3766 3767 3769 4241
4242 4244 4526 4527 4529 4583 4584 4586 4773 4774
4776 5153 5154 5156 5495 5496 5498 5628 5629 5631

즉, 이 [문자는 새 파일이 시작되어야 함을 나타냅니다. 항목( [ entry*], 여기서 *정수)은 항상 숫자 순서로 되어 있으며 1에서 N까지 연속된 정수입니다(실제 입력 파일에서는 N = 200001).

Bash에서 자동 텍스트 파일 분할을 수행할 수 있는 방법이 있습니까? 실제 입력에는 entry.txt실제로 200,001개의 항목이 포함되어 있습니다.

답변1

그리고분할GNU coreutils(비임베디드 Linux, Cygwin)에서:

csplit -f entry -b '%d.txt' entry.txt '/^\[ .* \]$/' '{*}'

entry0.txt첫 번째 헤더 앞 부분을 포함하는 추가 빈 파일이 생성됩니다 .

기준분할{*}무한 반복기와 접미사 형식을 지정하는 옵션이 없기 -b때문에 다른 시스템에서는 먼저 부품 수를 계산한 다음 출력 파일의 이름을 바꿔야 합니다.

csplit -f entry -n 9 entry.txt '/^\[ .* \]$/' "{$(egrep -c '^'\[ .* \]$' <entry.txt)}"
for x in entry?????????; do
  y=$((1$x - 1000000000))
  mv "entry$x" "entry$y.txt"
done

답변2

이것은 아름답고 간단하며 입이 떡 벌어질 만한 농담입니다.

$ gawk '/^\[/{match($0, /^\[ (.+?) \]/, k)} {print >k[1]".txt" }' entry.txt

이는 다음에 적용됩니다.어느파일 크기 는 각 항목의 줄 수에 관계없이 각 항목 제목 이 [ blahblah blah blah ].[]


설명하다:

awk그리고 gawk입력 파일을 한 줄씩 읽습니다. 각 줄을 읽으면 해당 내용이 $0변수에 저장됩니다. 여기서는 gawk대괄호 안의 항목을 일치시키고 일치 항목을 배열에 저장하도록 지시합니다 k.

따라서 정규식이 일치할 때마다, 즉 파일의 모든 헤더에 대해 k[1]은 해당 줄에 대해 일치하는 영역을 갖게 됩니다. 즉, "entry1", "entry2", "entry3" 또는 "entryN"입니다.

<whatever value k currently has>.txt마지막으로 각 행을 Entry1.txt, Entry2.txt...entryN.txt 라는 파일에 인쇄합니다 .

이 방법은많은큰 파일의 경우 Perl보다 빠릅니다.

답변3

Perl에서는 이 작업을 훨씬 더 간단하게 수행할 수 있습니다.

perl -ne 'open(F, ">", ($1).".txt") if /\[ (entry\d+) \]/; print F;' file

답변4

이는 Python 명령줄을 통해 수행할 수 있습니다.

paddy$ python3 -c 'out=0
> with open("entry.txt") as f: 
>   for line in f:
>     if line[0] == "[":
>       if out: out.close()
>       out = open(line.split()[1] + ".txt", "w")
>     else: out.write(line)'

관련 정보