如何为大数据拆分和命名文本文件(基于内容行数)?

如何为大数据拆分和命名文本文件(基于内容行数)?

我在 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

相关内容