Как извлечь неизвестное количество строк из файла и создать для каждой новый файл? - PullRequest
0 голосов
/ 01 августа 2020

У меня есть текстовый файл (file_1), который будет содержать неизвестное количество строк. Я хочу извлечь каждую строку и поместить ее в новый файл (кроме первой строки). Я пытался сделать это, используя для l oop, w c и 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.

Example File_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

Гипотетические файлы вывода:

File_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

File_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

et c.

Я не уверен, почему это не сработает. Может ли кто-нибудь подсказать, почему и предоставить новый метод?

Спасибо

Ответы [ 3 ]

2 голосов
/ 01 августа 2020

С 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

1 голос
/ 02 августа 2020

Не нужно ничего программировать, существует стандартная Unix утилита с именем split, которая делает именно это: разбивает файл на части по N строк.

Вот что вы ищете, используя GNU split:

$ split --lines=1 --numeric-suffixes=1 --suffix-length=5 --additional-suffix=.txt File_1 File_1.
0 голосов
/ 02 августа 2020

Ошибка, которую вы получили, исходит от seq, которую imo не следует включать в вашу задачу, поскольку bash или любая совместимая с POSIX оболочка имеет встроенную команду, которая может использоваться для этой конкретной задачи.

Также см. Прочитать файл или поток построчно или поле за полем в bash

Почему вам не следует Прочитать строки с помощью for in bash

Это сказано, если файл / данные не такие большие (менее 1k + строк). a while read l oop можно использовать.

#!/usr/bin/env bash

file=File_1

count=1

while IFS= read -r lines; do
  printf '%s %s\n' "$lines" > "$file.$((count++)).txt"
done < <(tail -n+2 "$file")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...