Divide o arquivo por linha removendo o primeiro campo e usando-o como um nome para a peça resultante

0

Eu tenho esse arquivo de texto:

19-198-0000 NORTHANGER ABBEY
19-198-0001 THIS LITTLE WORK WAS FINISHED IN THE YEAR EIGHTEEN O THREE AND INTENDED FOR IMMEDIATE PUBLICATION IT WAS DISPOSED OF TO A BOOKSELLER IT WAS EVEN ADVERTISED
19-198-0002 NEITHER THE AUTHOR NOR THE PUBLIC HAVE ANY OTHER CONCERN THAN AS SOME OBSERVATION IS NECESSARY UPON THOSE PARTS OF THE WORK WHICH THIRTEEN YEARS HAVE MADE COMPARATIVELY OBSOLETE
19-198-0003 THE PUBLIC ARE ENTREATED TO BEAR IN MIND THAT THIRTEEN YEARS HAVE

e assim por diante. O que eu quero é uma maneira de criar o mesmo número de arquivos de texto menores que as linhas neste inicial, seu nome para ser os dígitos no início da linha e seu conteúdo para ser o resto.

Por exemplo, no pequeno snippet acima:

19-198-0000.txt  would contain: NORTHANGER ABBEY
19-198-0001.txt  would contain: THIS LITTLE WORK WAS FINISHED IN THE YEAR EIGHTEEN O THREE AND INTENDED FOR IMMEDIATE PUBLICATION IT WAS DISPOSED OF TO A BOOKSELLER IT WAS EVEN ADVERTISED
19-198-0002.txt  would contain: NEITHER THE AUTHOR NOR THE PUBLIC HAVE ANY OTHER CONCERN THAN AS SOME OBSERVATION IS NECESSARY UPON THOSE PARTS OF THE WORK WHICH THIRTEEN YEARS HAVE MADE COMPARATIVELY OBSOLETE
19-198-0003.txt  would contain: THE PUBLIC ARE ENTREATED TO BEAR IN MIND THAT THIRTEEN YEARS HAVE

e assim por diante.

    
por Qubix 31.01.2017 / 16:34

3 respostas

1
while read -r tag line; do
    printf '%s\n' "$line" >"$tag".txt
done <text.in

Quando você lê duas variáveis com read , a primeira palavra é colocada na primeira variável e o restante da linha é colocada na segunda.

O que constitui uma "palavra" depende do valor de $IFS . Por padrão, read dividirá a linha em palavras com base em espaços, tabulações ou novas linhas.

O loop usa isso para enviar a linha (menos a primeira palavra, ou "tag") para um arquivo cujo nome é retirado do início da linha.

    
por 31.01.2017 / 16:57
1

Não há necessidade de bash :

awk '{file = $1".txt"; $1=""; print substr($0,2) > file; close(file)}' a_text_file
  • Obtenha file da primeira coluna, acrescente .txt a isso.
  • Elimine a primeira coluna.
  • Imprime as colunas restantes (menos o espaço principal) no file .

Enquanto isso, sobre esse while loop em bash :

$ (echo first; echo -n second) | while read line; do echo $line; done
first
$ 

Mmm, perda silenciosa de dados. É melhor ter certeza de que existem sempre novas linhas finais, né?

    
por 31.01.2017 / 17:03
0

conseguiu fazer isso:

#!/bin/bash

while read -r filename content ; do
    printf '%s\n' "$content" >> "${filename}.txt"
done < some_file.txt
    
por 31.01.2017 / 16:57