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

Rag*_*Rag 3 sed awk text-processing

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

有人可以在这方面帮助我。

谢谢

ter*_*don 13

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

split -d -l 1000 file '' 
Run Code Online (Sandbox Code Playgroud)

这会将文件拆分为 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
Run Code Online (Sandbox Code Playgroud)

请注意,-d--additional-suffix不可移植,可能无法用于您的split. 它们可用于 GNU split,这是 Linux 系统上的默认设置。

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

for i in {00..10}; do
    mkdir -p $i
    mv "$i".txt "$i"/
done
Run Code Online (Sandbox Code Playgroud)

而且,如果您不想要前导 0,您可以重命名它们:

for i in {00..10}; do
    mkdir -p $i
    mv "$i".txt "$i"/"${i##0}".txt
done
Run Code Online (Sandbox Code Playgroud)

最后,如果你想从 1 而不是从 0 开始,再次假设 GNU split,你可以这样做:

split -d --numeric-suffixes=1 -l 1000 --additional-suffix='.txt' file ''
Run Code Online (Sandbox Code Playgroud)

这将产生:

01.txt  03.txt  05.txt  07.txt  09.txt  11.txt
02.txt  04.txt  06.txt  08.txt  10.txt 
Run Code Online (Sandbox Code Playgroud)


Ed *_*ton 5

我会做这样的事情(未经测试),假设您的输入文件名是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
Run Code Online (Sandbox Code Playgroud)

这将创建输出目录/文件,如:

1/Chrom   2/Chrom   3/Chrom   etc.
Run Code Online (Sandbox Code Playgroud)

如果您真的希望目录名和文件名都是唯一的,那么这样做是一个微不足道的调整(更改FILENAMEcnt ".txt"),但这似乎是多余的。