我有一个文本文件(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中算术表达式/构造的一部分,请参阅算术扩展。