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)
我会做这样的事情(未经测试),假设您的输入文件名是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)
如果您真的希望目录名和文件名都是唯一的,那么这样做是一个微不足道的调整(更改FILENAME为cnt ".txt"),但这似乎是多余的。