Movendo linhas para separar arquivos de uma só vez [duplicados]

0

Tenho muitos arquivos e desejo exportar determinadas linhas para novos arquivos, mantendo os arquivos de entrada como estão. Por exemplo, eu quero que todas as linhas que começam com a sejam enviadas para um novo arquivo, vamos chamar isso de a.txt, e então eu quero que todas as outras linhas sejam enviadas para um arquivo separado, bcd.txt.

a.......

b.......

c.......

a.......

d.......

Atualmente, estou usando grep '^a' infile.txt > a.txt para fazer a primeira parte e depois dupliquei o arquivo de entrada e usei sed -i 's/^a.*$//g para excluir as linhas a começando com a. Existe uma maneira que eu possa fazer as duas tarefas, mantendo o arquivo de entrada original e não duplicá-lo?

    
por mah 05.07.2018 / 19:30

2 respostas

0

Para obter toda a linha que começa com a :

grep '^a' infile.txt >a.txt

Para obter todas as linhas que não começam com um 'a':

grep '^[^a]' infile >bcd.txt   # or grep -v '^a' infile.txt >bcd.txt

A expressão [^...] significa "qualquer caractere que não esteja neste conjunto de caracteres" e o conjunto contém um único a .

Ação combinada, usando awk :

awk '/^a/ { print >"a.txt"; next } { print >"bcd.txt" }' infile.txt

O programa awk aciona o primeiro bloco para qualquer linha que comece com a e o segundo bloco para todas as outras linhas (não as a lines, devido à instrução next no primeiro bloco). A instrução print >filename imprimirá a linha atual para o arquivo fornecido.

    
por 05.07.2018 / 19:37
0

Se você quiser que as linhas que não sejam a sejam enviadas para bcd.txt , basta inverter o grep :

grep    '^a' infile.txt > a.txt
grep -v '^a' infile.txt > bcd.txt

Outra opção, usando apenas um comando, seria awk:

awk '/^a/ { print > "a.txt" } ! /^a/ { print > "bcd.txt" }' < input

Rearranjado um pouco, parece:

awk '
    /^a/ { print > "a.txt" } 
  ! /^a/ { print > "bcd.txt" }' 
  < input

... onde as linhas que começam com a entram no primeiro bloco e são gravadas (anexadas) a a.txt , enquanto as linhas que não não começam com a vão para o segundo bloquear e são gravados (anexados) a bcd.txt .

    
por 05.07.2018 / 19:36