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