如何从文件中提取未知数量的行,并为每个行生成一个新文件



我有一个文本文件(file_1(,它将包含未知数量的行。我想提取每一行并将其放在一个新文件中(除了第一行(。我一直在尝试使用for循环、wc和head\tail来实现这一点,但我无法使其发挥作用。有什么建议吗?

我一直在使用的命令:

wc -l File_1 > File_1.wc 
for i in $(seq 1 $(cat File_1.wc)); do head -${i} File_1 | tail -1 > File_1.${i}.txt ; done

每当我使用它时,我都会收到以下错误消息:

seq: invalid floating point argument: ‘File_1’
Try 'seq --help' for more information.

示例文件_1

Aug 1, 2020  7:08 PM Start clustering of 102 queries
GCA_001696625.1_C1HIR_9889_genomic.fna_Candidate_Sequence_g48.t1 GCA_007994515.1_UK0001_genomic.fna_Candidate_Sequence_g32.t1 GCA_007994515.1_UK0001_genomic.fna_Candidate_Sequence_g33.t1 GCA_001696625.1_C1HIR_9889_genomic.fna_Candidate_Sequence_g11.t1 GCA_001696625
GCA_005930515.1_160527_genomic.fna_Candidate_Sequence_g10.t1 GCA_005930515.1_160527_genomic.fna_Candidate_Sequence_g11.t1 GCA_005930515.1_160527_genomic.fna_Candidate_Sequence_g12.t1 GCA_005930515.1_160527_genomic.fna_Candidate_Sequence_g13.t1 GCA_007994515.1_UK000
GCA_007994515.1_UK0001_genomic.fna_Candidate_Sequence_g35.t1 GCA_007994515.1_UK0001_genomic.fna_Candidate_Sequence_g36.t1
GCA_001696625.1_C1HIR_9889_genomic.fna_Candidate_Sequence_g47.t1
GCA_005930515.1_160527_genomic.fna_Candidate_Sequence_4380183-4385401(+)_61
GCA_001696625.1_C1HIR_9889_genomic.fna_Candidate_Sequence_5936-11161(-)_63

假设输出文件:

文件_1.1.txt

GCA_001696625.1_C1HIR_9889_genomic.fna_Candidate_Sequence_g48.t1 GCA_007994515.1_UK0001_genomic.fna_Candidate_Sequence_g32.t1 GCA_007994515.1_UK0001_genomic.fna_Candidate_Sequence_g33.t1 GCA_001696625.1_C1HIR_9889_genomic.fna_Candidate_Sequence_g11.t1 GCA_001696625

文件_1.2.txt

GCA_005930515.1_160527_genomic.fna_Candidate_Sequence_g11.t1 GCA_005930515.1_160527_genomic.fna_Candidate_Sequence_g12.t1 GCA_005930515.1_160527_genomic.fna_Candidate_Sequence_g13.t1 GCA_007994515.1_UK000

File_1.3.txt

GCA_007994515.1_UK0001_genomic.fna_Candidate_Sequence_g35.t1 GCA_007994515.1_UK0001_genomic.fna_Candidate_Sequence_g36.t1

等等。

我不知道为什么这行不通。有人能提出原因并提供一种新的方法吗?

感谢

使用GNU awk:

awk 'NR>1{f="File_1." NR-1 ".txt"; print >f; close(f)}' File_1

参见:8个强大的Awk内置变量–FS、OFS、RS、ORS、NR、NF、FILENAME、FNR

无需编程,有一个名为split的标准Unix实用程序可以做到这一点:用N行的块分割文件。

以下是您正在寻找的,使用GNUsplit:

$ split --lines=1 --numeric-suffixes=1 --suffix-length=5 --additional-suffix=.txt File_1 File_1.

您收到的错误来自seq,imo不应将其包含在您的任务中,因为bash或任何符合POSIX的shell都有可用于该特定任务的内置程序。

另请参阅bash 中逐行或逐字段读取文件或流

为什么你不应该在bash 中读取带有for的行


如果文件/数据没有那么大(少于1k行(。可以使用while读取循环。

#!/usr/bin/env bash
file=File_1
count=1
while IFS= read -r lines; do
printf '%s %sn' "$lines" > "$file.$((count++)).txt"
done < <(tail -n+2 "$file")
  • count=1每行递增一,$(( ))中的count++,请参阅Shell算术。

  • >是重定向的一部分

  • IFS参见外壳变量

  • 在shell上运行help read

  • 也称为help printf

  • <( )被称为过程替代

  • tail -n+2删除文件的第一行。

  • $(( ))是bash中算术表达式/构造的一部分,请参阅算术扩展。

最新更新