我正在编写一个 shell 脚本,在其中读取目录中的所有文件,执行一些条件检查并根据记录数(行)拆分某些文件
我想将文件 abc.txt 拆分为 abc(AA 或 01).txt (只要它以 abc 开头并以 .txt 结尾,我不介意任何内容)
有没有一种简单的方法可以做到这一点?
我正在使用 split 命令:
split -l $line_count $file $????
我很困惑应该用什么代替???
我也对其他方法持开放态度,但我更愿意只更改 ???因为脚本的其他部分已经准备好了。
非常感谢
答案1
尝试:
split -l 5 --additional-suffix=.txt abc.txt abc
或者,如果您想要用数字代替字母:
split -l 5 -d --additional-suffix=.txt abc.txt abc
abc
我们在文件名后面添加的用作字首。
因为您想要.txt
作为后缀,所以我们添加了选项--additional-suffix=.txt
.
可选-d
指示split
使用数字而不是字母。
例子
让我们从一个包含一个文件的目录开始:
$ ls
abc.txt
现在,让我们拆分该文件:
$ split -l 5 -d --additional-suffix=.txt abc.txt abc
$ ls
abc00.txt abc01.txt abc02.txt abc03.txt abc.txt
解决方法1:使用shell
当前版本的 GNU split 支持该--additional-suffix
选项,并且split
是 GNU coreutils 的一部分。这意味着该选项最终将在所有 Linux 系统上可用。
split
对于当前缺乏它的系统,一种解决方法是在创建文件后重命名文件。例如:
$ split -l 5 -d abc.txt abc
$ for f in ./abc??; do mv "$f" "$f.txt"; done
$ ls
abc00.txt abc01.txt abc02.txt abc03.txt abc.txt
上面假设应用默认后缀长度 2。如果不是,请更改 的数量?
以匹配您正在使用的后缀长度。例如,如果您使用的后缀长度为 5:
$ split -l 5 -a 5 -d abc.txt abc
$ for f in ./abc?????; do mv "$f" "$f.txt"; done
$ ls
abc00000.txt abc00001.txt abc00002.txt abc00003.txt abc.txt
解决方法 2:使用 awk
此处,该选项l
指定每个拆分文件中包含的行数,并d
指定拆分文件名中使用的位数。确保d
足够大。
$ awk -v l=5 -v d=2 '{n="0000" int((NR-1)/l); f="abc" substr(n,length(n)+1-d) ".txt"; if (f!=old) close(old); old=f; print >f}' abc.txt
$ ls
abc00.txt abc01.txt abc02.txt abc03.txt abc.txt