Como exportar várias saídas do grep para um arquivo?

1

Eu tenho uma pequena linha de comando do grep que encontra certos valores em um arquivo de texto e os exporta para um .csv-file .

Aqui está:

cat file.txt | grep 'Values a' | cut -d' ' -f9 >a.csv
cat file.txt | grep 'Values b' | cut -d' ' -f9 >b.csv
cat file.txt | grep 'Values c' | cut -d' ' -f9 >c.csv
cat file.txt | grep 'Values d' | cut -d' ' -f9 >d.csv

Como posso modificar os comandos para obter um (separado por vírgula) .csv-file com quatro colunas a, b, c, d?
Qualquer ajuda é apreciada!

    
por Joe Doe 09.07.2016 / 18:19

2 respostas

1

Você pode usar paste

paste -d, {a..d}.csv > all.csv

ou (ignorando os arquivos intermediários usando a substituição do processo)

paste -d, <(grep 'Values a' file.txt | cut -d' ' -f9) <(grep 'Values b' file.txt | cut -d' ' -f9) <(grep 'Values c' file.txt | cut -d' ' -f9) <(grep 'Values d' file.txt | cut -d' ' -f9)

Existem maneiras mais eficientes e elegantes de fazer o que você quer que não envolvam fazer várias passagens do mesmo arquivo - mas você precisaria compartilhar um exemplo que mostre o formato do seu file.txt

    
por steeldriver 09.07.2016 / 19:02
1

Como o primeiro comentário disse, sem uma visão do seu "arquivo.txt", é difícil saber com certeza se estamos acertando.

Meu primeiro pensamento foi por que você não toma o caminho fácil? O > > irá acrescentar, então crie a única coisa, adicione o resto.

cat file.txt | grep 'Values a' | cut -d' ' -f9 > a.csv
cat file.txt | grep 'Values b' | cut -d' ' -f9 >> a.csv
cat file.txt | grep 'Values c' | cut -d' ' -f9 >> a.csv
cat file.txt | grep 'Values d' | cut -d' ' -f9 >> a.csv

Então eu me perguntei por que você gata em tudo

grep 'Values a' file.txt | cut -d' ' -f9 > a.csv
grep 'Values b' file.txt | cut -d' ' -f9 >> a.csv
grep 'Values c' file.txt | cut -d' ' -f9 >> a.csv
grep 'Values d' file.txt | cut -d' ' -f9 >> a.csv

Isso funciona, mas coloca as 4 coisas em novas linhas, em vez de valores separados por vírgula.

Então, concentrei-me em impedir que as novas linhas fossem inseridas e obter uma vírgula. O awk pode lidar com isso.

grep 'Values a' file.txt | cut -d' ' -f9 | awk '{printf $0 ","}' > a.csv
grep 'Values b' file.txt | cut -d' ' -f9 | awk '{printf $0 ","}' >> a.csv

e assim por diante. Isso funciona, mas logo antes de eu apertar "enviar" eu percebi que eu estava seguindo junto com você usando o corte e nós não precisamos. o awk pode selecionar a 9ª coisa.

grep 'Values a' file.txt | awk '{printf $9 ","}' > a.csv
grep 'Values b' file.txt | awk '{printf $9 ","}' >> a.csv

Isso funcionou em um pequeno caso de teste que eu fiz, talvez não no seu caso de teste.

Se eu estivesse repetindo os dados para criar um arquivo, provavelmente preferiria mantê-lo em linhas separadas, em vez de em um emaranhado grande e complicado como o outro recomendado. Então eu não acho que eu vá por um forro, quatro linhas que eu entendo são boas o suficiente.

Se você vai fazer mais trabalhos de shell como este, eu sugiro que você obtenha uma cópia do antigo livro Unix Power Tools. Tem muitos truques como esse.

    
por pauljohn32 10.07.2016 / 08:04