Como obter parte de linhas de todos os arquivos .txt em um diretório?

0

Eu tenho 5.000 arquivos de texto de citações de artigos de periódicos. Eu estou tentando extrair apenas a parte abstrata. O que significa que eu quero manter o mesmo documento de texto e excluir todos os outros textos, exceto o resumo. Eu sou muito novo no Linux e tenho navegado na sua prancha por um tempo.

como extrair palavras que após a palavra-chave

execute o comando em todo o arquivo em um diretório

for file in test
nano my.sh
while read variable do
  sed '0,/^Abstract$/d' 
done <file

Aqui está um exemplo de um arquivo semelhante a um artigo de revista científica

Sponsor     : Beckman Res Inst Cty Hope
      1500 E. Duarte Road
      Duarte, CA  910103000    /   -

NSF Program : 1114      CELL BIOLOGY
Fld Applictn: 0000099   Other Applications NEC                  
          61        Life Science Biological                 
Program Ref : 9285,
Abstract    :

          Studies of chickens have provided serological and nucleic acid                 
          probes useful in defining the major histocompatibility complex                 
          (MHC) in other avian species.  Methods used in detecting genetic               
          diversity at loci within the MHC of chickens and mammals will be               
          applied to determining the extent of MHC polymorphism within                   
          small populations of ring-necked pheasants, wild turkeys, cranes,              
          Andean condors and other species.  The knowledge and expertise                 
          gained from working with the MHC of the chicken should make for                
          rapid progress in defining the polymorphism of the MHC in these                
          species and in detecting the polymorphism of MHC gene pool within              
          small wild and captive populations of these birds.       

Graças a KasiyA e John1024, agora entendo como obter partes de linhas de um diretório. Aqui está como você faz isso para subdiretórios

find -name *txt -type d -exec sed -i '0,/^Abstract/d' *.txt {} \;

Para mais detalhes sobre o comando find, clique AQUI OU este link de stackoverflow Aqui

    
por user3426338 07.12.2014 / 20:13

2 respostas

1

Pelo que entendi, você deseja alterar uma série de arquivos in-loco. Você deseja excluir todos e até incluir a primeira linha que consiste em no total de Abstract . Se esses arquivos estiverem no diretório atual e forem todos nomeados com uma extensão .txt , use:

sed -i '0,/^Abstract$/d' *.txt

Como isso substituirá os arquivos antigos e, caso algo dê errado, não use isso sem ter um backup.

Isso pode exigir o GNU sed (que é padrão no Linux).

Como funciona

  • -i

    A opção -i informa sed para editar arquivos no local. O arquivo antigo será sobrescrito.

  • 0,/^Abstract$/d

    Este comando informa sed para excluir ( d ) todas as linhas do primeiro (número 0) até e incluindo a primeira linha que corresponde à expressão regular ^Abstract$ . O circunflexo, ^ , corresponde ao início da linha e o cifrão corresponde ao final da linha. Assim, este regex corresponde a uma linha que contém somente a palavra Abstract com não outros caracteres na linha.

  • *.txt

    Isso diz ao shell para selecionar todos os arquivos no diretório atual que tenham o sufixo .txt .

Atualizar

Isso excluirá todas as linhas de cada arquivo até a primeira linha que começa com Abstract :

sed -i '0,/^Abstract/d' *.txt

Como o $ foi removido, essa expressão regular exige apenas que a linha comece com Abstract .

    
por 07.12.2014 / 20:38
1

Usando sed :

sed -ni.bak '/^Abstract/,$p' *.txt

Obtenha todas as linhas que iniciem ^ com Abstract a , end $ do arquivo e salve uma cópia do arquivo original chamado *.txt.bak usando a opção -i do sed.

com awk :

awk '/^Abstract/,0' *.txt

Se você quiser também para sub_directory, use o comando com o comando find desta forma:

find /path/to/main-dir -type f -name "*.txt" -exec  sed -ni.bak '/^Abstract/,$p' '{}';

Isso é muito melhor se você tivesse uma nova linha em nomes de arquivos:

find /path/to/main-dir -type f -name "*.txt" -print0 | while IFS= read -d '' -r file
do
    sed -ni.bak '/^Abstract/,$p' "$file";
done

Na sua solução fornecida ( find -name *txt -type d -exec sed -i '0,/^Abstract/d' *.txt {} \; ) no corpo da sua pergunta, você procura por diretórios ( -type d usados para pesquisar diretórios) cujos nomes terminam com txt , se você não tiver nenhum diretório com o mesmo nome como *txt , a parte -exec não será executada. Então você não faz nada com esse comando.

Portanto, você precisa alterar *txt -type d para "*.txt" -type f (isso significa todos os arquivos * .txt -type f ) e citá-los se os nomes dos arquivos contiverem espaços. E também você precisa remover o comando *.txt do final de sed porque '{}' no comando find aponta para o arquivo atual que é encontrado e o cita também. Mesmo seria melhor se você especificasse o caminho para encontrar o comando. Finalmente, seu comando testado seria como seguir:

find /path/to/main-dir -name "*.txt" -type f -exec sed -i '0,/^Abstract/d' '{}' \;
    
por 07.12.2014 / 21:07