从单个文件迭代复制范围并粘贴到新文件中

从单个文件迭代复制范围并粘贴到新文件中

我有一个包含 10023 行的文件。我想从文件中复制每 1000 行并将其粘贴到新文件中,该文件可以命名为 1.txt 和 2.txt 等。我想将文件 1.txt 2.txt 等移动到新创建的文件夹 1、2 等中。

有人可以在这方面帮助我吗?

谢谢

答案1

这就是split目的。要将文件拆分为多个 1000 行(或更少,对于最后一个)的文件,您可以执行以下操作:

split -d -l 1000 file '' 

这会将文件拆分为每行 1000 行的文件 ( -l 1000),并使用数字后缀作为.txt附加后缀并使用空前缀 ( '')。包含 10023 行的文件的结果将是 11 个名为00, 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移植,并且可能不适用于您的split.它们可用于 GNU,split这是 Linux 系统上的默认设置。

您现在可以根据需要移动文件:

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

最后,如果你想从 1 而不是从 0 开始,再次假设 GNU 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.

如果您确实希望目录名和文件名都是唯一的,那么只需进行一个简单的调整(更改FILENAMEcnt ".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

相关内容