단일 파일의 범위를 반복적으로 복사하여 새 파일에 붙여넣기

단일 파일의 범위를 반복적으로 복사하여 새 파일에 붙여넣기

10023줄이 포함된 파일이 있습니다. 파일에서 1000줄마다 복사하여 1.txt 및 2.txt 등의 이름을 가진 새 파일에 붙여넣고 싶습니다. 1.txt 2.txt 등의 파일을 새로 생성된 폴더 1, 2 등으로 이동하고 싶습니다.

누구든지 도와줄 수 있나요?

감사해요

답변1

그것이 split목적입니다. 파일을 1000줄(마지막 줄의 경우 그 이하)의 여러 파일로 분할하려면 다음을 수행할 수 있습니다.

split -d -l 1000 file '' 

이렇게 하면 파일이 추가 접미사 -l 1000로 숫자 접미사 .txt와 빈 접두사( '')가 포함된 각각 1000줄( )의 파일로 분할됩니다. 10023개 라인을 포함하는 파일의 결과는 00, , ..., 라는 이름의 11개 01파일이 됩니다 10.

$ wc -l file
10023 file
$ split -d -l 1000 --additional-suffix='.txt' file ''
$ ls
00.txt  02.txt  04.txt  06.txt  08.txt  10.txt
01.txt  03.txt  05.txt  07.txt  09.txt  file

은(는) 이식 가능 -d하지 않으며 --additional-suffix귀하의 시스템에서는 작동하지 않을 수 있습니다 . 이는 Linux 시스템의 기본값인 splitGNU에서 사용할 수 있습니다 .split

이제 필요에 따라 파일을 이동할 수 있습니다.

for i in {00..10}; do
    mkdir -p $i
    mv "$i".txt "$i"/
done

앞에 0이 필요하지 않으면 이름을 바꿀 수 있습니다.

for i in {00..10}; do
    mkdir -p $i
    mv "$i".txt "$i"/"${i##0}".txt
done

마지막으로, 다시 GNU 를 가정하여 0 대신 1에서 시작하려면 split다음을 수행할 수 있습니다.

split -d --numeric-suffixes=1 -l 1000 --additional-suffix='.txt' file ''

그러면 다음이 생성됩니다.

01.txt  03.txt  05.txt  07.txt  09.txt  11.txt
02.txt  04.txt  06.txt  08.txt  10.txt 

답변2

입력 파일 이름이 다음과 같다고 가정하면 (테스트되지 않은) 이와 같은 작업을 수행합니다 Chrom.

awk '
(NR % 1000) == 1 {
    close(out)
    if ( system("mkdir -p \047" (++cnt) "\047") != 0 ) {
        print "Failed to create directory " cnt |"cat>&2"
        exit 1
    }
    out = cnt "/" FILENAME
}
{ print > out }
' Chrom

그러면 다음과 같은 출력 디렉터리/파일이 생성됩니다.

1/Chrom   2/Chrom   3/Chrom   etc.

디렉터리 이름과 파일 이름을 모두 고유하게 만들고 싶다면 간단한 조정( FILENAME으로 변경 cnt ".txt")만 하면 되지만 이는 중복되는 것 같습니다.

답변3

itertools모듈 접근 방식을 사용하여 islice입력 파일 핸들 반복자를 청크한 다음 파일을 원하는 디렉터리에 저장하여 생성합니다.

$ python3 -c 'import sys, pathlib, itertools
ifile,chunk_size = sys.argv[1:]
with open(ifile) as fh:
  for i,chunk in enumerate(iter(lambda:list(itertools.islice(fh,int(chunk_size))),[])):
    filepath = pathlib.Path(f"{i}/{i}.txt") 
    filepath.parent.mkdir(parents=True,exist_ok=True)
    with filepath.open("w") as f:
      f.writelines(chunk)
' file 1000
$ tree -F

산출:

.
├── 1/
│   └── 1.txt
├── 10/
│   └── 10.txt
├── 11/
│   └── 11.txt
├── 2/
│   └── 2.txt
├── 3/
│   └── 3.txt
├── 4/
│   └── 4.txt
├── 5/
│   └── 5.txt
├── 6/
│   └── 6.txt
├── 7/
│   └── 7.txt
├── 8/
│   └── 8.txt
├── 9/
│   └── 9.txt
├── file

관련 정보