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)'