我在 Linux 机器上有 1000 个文本文件,每个文本文件的名称都有一个前缀 ( OG00
*) 并包含 9 个唯一 ID。我想为每个具有文本文件名的 ID 创建一个文本文件 -OG0012637_1.txt, OG0012637_2.txt, OG0012637_3.txt, OG0012637_4.txt, OG0012637_5.txt....OG0012637_9.txt
Input:
$ cat OG0012637.txt
TRINITY_DN9932_c0_g2_i1.p1
TRINITY_DN17663_c0_g1_i1.p1
TRINITY_DN6645_c0_g1_i2.p1
TRINITY_DN2462_c0_g1_i2.p1
TRINITY_DN19713_c3_g1_i2.p1
TRINITY_DN4587_c0_g1_i1.p1
TRINITY_DN4405_c0_g1_i1.p1
TRINITY_DN7191_c1_g2_i1.p1
TRINITY_DN1740_c0_g1_i2.p1
所需的输出文件:
$ cat OG0012637_1.txt
TRINITY_DN9932_c0_g2_i1.p1
$ cat OG0012637_2.txt
TRINITY_DN17663_c0_g1_i1.p1
$ cat OG0012637_3.txt
TRINITY_DN6645_c0_g1_i2.p1
$ cat OG0012637_4.txt
TRINITY_DN2462_c0_g1_i2.p1
$ cat OG0012637_5.txt
TRINITY_DN19713_c3_g1_i2.p1
$ cat OG0012637_6.txt
TRINITY_DN4587_c0_g1_i1.p1
$ cat OG0012637_7.txt
TRINITY_DN4405_c0_g1_i1.p1
$ cat OG0012637_8.txt
TRINITY_DN7191_c1_g2_i1.p1
$ cat OG0012637_9.txt
TRINITY_DN1740_c0_g1_i2.p1
答案1
为此类任务制作的工具/实用程序是分裂。该GNU
版本具有适合您的用例的选项:
for f in OG00*.txt; do
split -l1 -a1 -e --additional-suffix=.txt --numeric-suffixes=1 "$f" "${f%????}_"
done
输出
.
├── OG0012637_1.txt
├── OG0012637_2.txt
├── OG0012637_3.txt
├── OG0012637_4.txt
├── OG0012637_5.txt
├── OG0012637_6.txt
├── OG0012637_7.txt
├── OG0012637_8.txt
├── OG0012637_9.txt
└── OG0012637.txt
-l1
应将文件拆分为每行一个。-a1
应将号码长度保持为个位数,因为我们只有 9 个生成的文件需要处理。--numeric-suffixes
应从 1 而不是默认的 0 开始对输出文件进行编号。--additional-suffix
应将 .txt 附加到输出文件中,而不是默认不附加任何内容。- 前缀是基本名称后跟下划线,而不是默认的 xa。
答案2
如果您无法访问 split 的 GNU 实现,则使用 awk:
awk '
FNR==1 {
basename = substr(FILENAME,1,length(FILENAME)-4)
}
{
outfile = basename "_" FNR ".txt"; print > outfile; close(outfile)
}
' OG*.txt