Discussion:
Como separar o ultimo campo.
Wanderson Gonzalez
2010-11-04 19:26:36 UTC
Permalink
Galera,
preciso pegar o ultimo campo. Vou explicar, tenho as linhas

/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp

preciso separar o que é o full path e o que é o arquivo. Tipo:

full=/dados/teste/uu/
arq=eu.sh

full=/dados/eu/
arq=eu.log

e por ai vai.

Sendo que podera haver fullpaths de todos os tamanhos..

ja tentei usar o seguinte comando

ls /dados/nfs/nfs.sh |cut -d '/' -f 4-

ai eu consigo pegar o nfs.sh

so que posso ter o seguinte ls /dir1/dir2/dir3/dir/dir5/arquivo

como fazer para que o -f 4- seja auto ajustavel ??

Grato
Moacir Souza
2010-11-04 20:12:55 UTC
Permalink
Wanderson,

Primeiro gostaria de fazer algumas perguntas, pois a solução que
vou mostrar a seguir pode não ser completa sem conhecer esses
detalhes:

1 - No último item do seu exemplo, o "cp" é um diretório ou um arquivo?
2 - Ou arquivos tem sempre um ponto para separá-los das suas
respectivas extensões?

E agora o exemplo. Eu gosto de resolver problemas assim usando
uma combinação de cut e rev. Claro que existem outros métodos, mas sou
fã desse em particular porque ele é divertido, criativo e já me ajudou
um bocado. Veja:

1 - O arquivo com os itens:

$ cat a
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp

2 - Os arquivos, ou campos finais

$ rev a | cut -d / -f 1 | rev
eu.sh
eu.log
cp

3 - Os caminhos (ou full paths, como você chamou):

$ rev a | cut -d / -f 2- | rev
/dados/teste/uu
/dados/eu
/nfs/bin

[]'s,
Moacir Filho
Post by Wanderson Gonzalez
Galera,
preciso pegar o ultimo campo. Vou explicar, tenho as linhas
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp
full=/dados/teste/uu/
arq=eu.sh
full=/dados/eu/
arq=eu.log
e por ai vai.
Sendo que podera haver fullpaths de todos os tamanhos..
ja tentei usar o seguinte comando
ls /dados/nfs/nfs.sh |cut -d '/' -f 4-
ai eu consigo pegar o nfs.sh
so que posso ter o seguinte ls /dir1/dir2/dir3/dir/dir5/arquivo
como fazer para que o -f 4- seja auto ajustavel ??
Grato
------------------------------------
---------------------------------------------------------------------
Esta lista não admite a abordagem de outras liguagens de programação, como perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio aviso.
---------------------------------------------------------------------
---------------------------------------------------------------------
Esta lista é moderada de acordo com o previsto em http://www.listas-discussao.cjb.net
---------------------------------------------------------------------
Servidor Newsgroup da lista: news.gmane.org
Grupo: gmane.org.user-groups.programming.shell.brazil
Links do Yahoo! Grupos
--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Moacir da Cruz Souza Filho

Analista de Sistemas: Suporte Unix Avançado
Mestrando em Ciências da Computação
Bacharel em Engenharia da Computação
Técnico em Eletrônica
Linux user #449600
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Wanderson Gonzalez
2010-11-04 20:18:19 UTC
Permalink
Moacir,
muito obrigado, sua dica resolveu meu problema

--- Em qui, 4/11/10, Moacir Souza <***@gmail.com> escreveu:


De: Moacir Souza <***@gmail.com>
Assunto: Re: [shell-script] Como separar o ultimo campo.
Para: shell-***@yahoogrupos.com.br
Data: Quinta-feira, 4 de Novembro de 2010, 20:12


 



Wanderson,

Primeiro gostaria de fazer algumas perguntas, pois a solução que
vou mostrar a seguir pode não ser completa sem conhecer esses
detalhes:

1 - No último item do seu exemplo, o "cp" é um diretório ou um arquivo?
2 - Ou arquivos tem sempre um ponto para separá-los das suas
respectivas extensões?

E agora o exemplo. Eu gosto de resolver problemas assim usando
uma combinação de cut e rev. Claro que existem outros métodos, mas sou
fã desse em particular porque ele é divertido, criativo e já me ajudou
um bocado. Veja:

1 - O arquivo com os itens:

$ cat a
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp

2 - Os arquivos, ou campos finais

$ rev a | cut -d / -f 1 | rev
eu.sh
eu.log
cp

3 - Os caminhos (ou full paths, como você chamou):

$ rev a | cut -d / -f 2- | rev
/dados/teste/uu
/dados/eu
/nfs/bin

[]'s,
Moacir Filho
Post by Wanderson Gonzalez
Galera,
preciso pegar o ultimo campo. Vou explicar, tenho as linhas
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp
full=/dados/teste/uu/
arq=eu.sh
full=/dados/eu/
arq=eu.log
e por ai vai.
Sendo que podera haver fullpaths de todos os tamanhos..
ja tentei usar o seguinte comando
ls /dados/nfs/nfs.sh |cut -d '/' -f 4-
ai eu consigo pegar o nfs.sh
so que posso ter o seguinte ls /dir1/dir2/dir3/dir/dir5/arquivo
como fazer para que o -f 4- seja auto ajustavel ??
Grato
------------------------------------
----------------------------------------------------------
Esta lista não admite a abordagem de outras liguagens de programação, como perl, C etc. Quem insistir em não seguir esta regra será moderado sem prévio aviso.
----------------------------------------------------------
----------------------------------------------------------
Esta lista é moderada de acordo com o previsto em http://www.listas-discussao.cjb.net
----------------------------------------------------------
Servidor Newsgroup da lista: news.gmane.org
Grupo: gmane.org.user-groups.programming.shell.brazil
Links do Yahoo! Grupos
--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Moacir da Cruz Souza Filho

Analista de Sistemas: Suporte Unix Avançado
Mestrando em Ciências da Computação
Bacharel em Engenharia da Computação
Técnico em EletrÎnica
Linux user #449600
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=










[As partes desta mensagem que não continham texto foram removidas]
André Saunite
2010-11-04 20:38:42 UTC
Permalink
Legal essa forma, nunca usei muito o rev, eu provavelmente faria dessa
forma:

$ cat a
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp

$ awk -F\/ '{print $NF}' a
eu.sh
eu.log
cp

$ for i in `cat a`; do dirname $i ; done
/dados/teste/uu
/dados/eu
/nfs/bin

Me parece que a forma com o cut e rev é melhor, só estou enviando esse
email pra demonstrar outra forma de se fazer.

Abs,
André Saunite
Post by Moacir Souza
Wanderson,
Primeiro gostaria de fazer algumas perguntas, pois a solução que
vou mostrar a seguir pode não ser completa sem conhecer esses
1 - No último item do seu exemplo, o "cp" é um diretório ou um arquivo?
2 - Ou arquivos tem sempre um ponto para separá-los das suas
respectivas extensões?
E agora o exemplo. Eu gosto de resolver problemas assim usando
uma combinação de cut e rev. Claro que existem outros métodos, mas sou
fã desse em particular porque ele é divertido, criativo e já me ajudou
$ cat a
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp
2 - Os arquivos, ou campos finais
$ rev a | cut -d / -f 1 | rev
eu.sh
eu.log
cp
$ rev a | cut -d / -f 2- | rev
/dados/teste/uu
/dados/eu
/nfs/bin
[]'s,
Moacir Filho
Post by Wanderson Gonzalez
Galera,
preciso pegar o ultimo campo. Vou explicar, tenho as linhas
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp
full=/dados/teste/uu/
arq=eu.sh
full=/dados/eu/
arq=eu.log
e por ai vai.
Sendo que podera haver fullpaths de todos os tamanhos..
ja tentei usar o seguinte comando
ls /dados/nfs/nfs.sh |cut -d '/' -f 4-
ai eu consigo pegar o nfs.sh
so que posso ter o seguinte ls /dir1/dir2/dir3/dir/dir5/arquivo
como fazer para que o -f 4- seja auto ajustavel ??
Grato
------------------------------------
----------------------------------------------------------
Esta lista não admite a abordagem de outras liguagens de
programação, como perl, C etc. Quem insistir em não seguir esta regra
será moderado sem prévio aviso.
Post by Wanderson Gonzalez
----------------------------------------------------------
<mailto:shell-script-unsubscribe%40yahoogrupos.com.br>
Post by Wanderson Gonzalez
----------------------------------------------------------
Esta lista é moderada de acordo com o previsto em
http://www.listas-discussao.cjb.net
Post by Wanderson Gonzalez
----------------------------------------------------------
Servidor Newsgroup da lista: news.gmane.org
Grupo: gmane.org.user-groups.programming.shell.brazil
Links do Yahoo! Grupos
--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Moacir da Cruz Souza Filho
Analista de Sistemas: Suporte Unix Avançado
Mestrando em Ciências da Computação
Bacharel em Engenharia da Computação
Técnico em Eletrônica
Linux user #449600
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[As partes desta mensagem que não continham texto foram removidas]
Enio Onodera
2010-11-04 20:48:59 UTC
Permalink
Legais mesmo as soluções. Eu não conhecia o rev e não sou bom em awk...Não entendi muito bem a finalidade do script, mas se for pra separar o caminho do diretório dos arquivos que ele contém, eu usaria:
ls -laR
com devidos filtros de interesse.Creio não ser a melhor solução e nem a que melhor atende às necessidades do Wanderson, mas fica registrada a idéia.
Abs,Enio Onodera




--- Em qui, 4/11/10, André Saunite <***@gmail.com> escreveu:

De: André Saunite <***@gmail.com>
Assunto: Re: [shell-script] Como separar o ultimo campo.
Para: shell-***@yahoogrupos.com.br
Data: Quinta-feira, 4 de Novembro de 2010, 18:38
















 









Legal essa forma, nunca usei muito o rev, eu provavelmente faria dessa

forma:



$ cat a

/dados/teste/uu/eu.sh

/dados/eu/eu.log

/nfs/bin/cp



$ awk -F\/ '{print $NF}' a

eu.sh

eu.log

cp



$ for i in `cat a`; do dirname $i ; done

/dados/teste/uu

/dados/eu

/nfs/bin



Me parece que a forma com o cut e rev é melhor, só estou enviando esse

email pra demonstrar outra forma de se fazer.



Abs,

André Saunite
Post by Moacir Souza
Wanderson,
Primeiro gostaria de fazer algumas perguntas, pois a solução que
vou mostrar a seguir pode não ser completa sem conhecer esses
1 - No último item do seu exemplo, o "cp" é um diretório ou um arquivo?
2 - Ou arquivos tem sempre um ponto para separá-los das suas
respectivas extensões?
E agora o exemplo. Eu gosto de resolver problemas assim usando
uma combinação de cut e rev. Claro que existem outros métodos, mas sou
fã desse em particular porque ele é divertido, criativo e já me ajudou
$ cat a
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp
2 - Os arquivos, ou campos finais
$ rev a | cut -d / -f 1 | rev
eu.sh
eu.log
cp
$ rev a | cut -d / -f 2- | rev
/dados/teste/uu
/dados/eu
/nfs/bin
[]'s,
Moacir Filho
Post by Wanderson Gonzalez
Galera,
preciso pegar o ultimo campo. Vou explicar, tenho as linhas
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp
full=/dados/teste/uu/
arq=eu.sh
full=/dados/eu/
arq=eu.log
e por ai vai.
Sendo que podera haver fullpaths de todos os tamanhos..
ja tentei usar o seguinte comando
ls /dados/nfs/nfs.sh |cut -d '/' -f 4-
ai eu consigo pegar o nfs.sh
so que posso ter o seguinte ls /dir1/dir2/dir3/dir/dir5/arquivo
como fazer para que o -f 4- seja auto ajustavel ??
Grato
------------------------------------
----------------------------------------------------------
Esta lista não admite a abordagem de outras liguagens de
programação, como perl, C etc. Quem insistir em não seguir esta regra
será moderado sem prévio aviso.
Post by Wanderson Gonzalez
----------------------------------------------------------
<mailto:shell-script-unsubscribe%40yahoogrupos.com.br>
Post by Wanderson Gonzalez
----------------------------------------------------------
Esta lista é moderada de acordo com o previsto em
http://www.listas-discussao.cjb.net
Post by Wanderson Gonzalez
----------------------------------------------------------
Servidor Newsgroup da lista: news.gmane.org
Grupo: gmane.org.user-groups.programming.shell.brazil
Links do Yahoo! Grupos
--
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
Moacir da Cruz Souza Filho
Analista de Sistemas: Suporte Unix Avançado
Mestrando em Ciências da Computação
Bacharel em Engenharia da Computação
Técnico em EletrÎnica
Linux user #449600
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
[As partes desta mensagem que não continham texto foram removidas]






























[As partes desta mensagem que não continham texto foram removidas]
Eri Ramos Bastos
2010-11-04 22:16:48 UTC
Permalink
O Unix já tem duas ferramentas prontas pra isso: basename, que extrai
o nome do arquivo e dirname, que extrai o diretório:

[0.10][1914] ebastos:/tmp$> basename /etc/passwd
passwd

[0.02][1916] ebastos:/tmp$> dirname /etc/passwd
/etc


Usando eles:

for linha in $(cat asdf); do file=$(basename $linha); full=$(dirname
$linha); echo "Full $full | File $file"; done


[]'s
Eri Ramos Bastos
Post by Enio Onodera
ls -laR
com devidos filtros de interesse.Creio não ser a melhor solução e nem a que melhor atende às necessidades do Wanderson, mas fica registrada a idéia.
Abs,Enio Onodera
Wanderson Gonzalez
2010-11-04 22:36:50 UTC
Permalink
Valeu Eri,
 
muito boa essa ideia tb.

--- Em qui, 4/11/10, Eri Ramos Bastos <***@gmail.com> escreveu:


De: Eri Ramos Bastos <***@gmail.com>
Assunto: Re: [shell-script] Como separar o ultimo campo.
Para: shell-***@yahoogrupos.com.br
Data: Quinta-feira, 4 de Novembro de 2010, 22:16


 



O Unix já tem duas ferramentas prontas pra isso: basename, que extrai
o nome do arquivo e dirname, que extrai o diretório:

[0.10][1914] ebastos:/tmp$> basename /etc/passwd
passwd

[0.02][1916] ebastos:/tmp$> dirname /etc/passwd
/etc

Usando eles:

for linha in $(cat asdf); do file=$(basename $linha); full=$(dirname
$linha); echo "Full $full | File $file"; done

[]'s
Eri Ramos Bastos
Post by Enio Onodera
ls -laR
com devidos filtros de interesse.Creio não ser a melhor solução e nem a que melhor atende às necessidades do Wanderson, mas fica registrada a idéia.
Abs,Enio Onodera
[As partes desta mensagem que não continham texto foram removidas]
Sérgio
2010-11-05 11:32:00 UTC
Permalink
Encontrei uma solução com sed

sed -i.backup -r 's,(.*/)(.*),full=\1 \narq=\2,' arquivo

use '-i' para alterar diretamente o arquivo com o sed, com
-i.backup ele gera um backup antes


troquei o delimitador para não confundir com as barras
veja sed -

r ............. expressões regulares extendidas
(.*/) ......... grupo 1 tudo até a ultima barra
(.*) .......... grupo 2 nome do arquivo
\1 ............ coloca o grupo 1 no local indicado
\2 ............ coloca o grupo 2 no local indicado
\n ............ note o \n antes de 'arq='
Post by Wanderson Gonzalez
Galera,
preciso pegar o ultimo campo. Vou explicar, tenho as linhas
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp
full=/dados/teste/uu/
arq=eu.sh
full=/dados/eu/
arq=eu.log
e por ai vai.
Sendo que podera haver fullpaths de todos os tamanhos..
ja tentei usar o seguinte comando
ls /dados/nfs/nfs.sh |cut -d '/' -f 4-
ai eu consigo pegar o nfs.sh
so que posso ter o seguinte ls /dir1/dir2/dir3/dir/dir5/arquivo
como fazer para que o -f 4- seja auto ajustavel ??
Grato
Eduardo Jaime Quiros Batres
2010-11-05 16:44:24 UTC
Permalink
há outras formas, até utilitários para isto, mas o que segue também funciona

COMPLETO=/por/aqui/chego/a/umarquivo
CAMINHO=${COMPLETO%/*}/
ARQUIVO=${COMPLETO##*/}

resultado da "execução":
CAMINHO=/por/aqui/chego/a/
ARQUIVO=umarquivo
Post by Wanderson Gonzalez
Galera,
preciso pegar o ultimo campo. Vou explicar, tenho as linhas
/dados/teste/uu/eu.sh
/dados/eu/eu.log
/nfs/bin/cp
full=/dados/teste/uu/
arq=eu.sh
full=/dados/eu/
arq=eu.log
e por ai vai.
Sendo que podera haver fullpaths de todos os tamanhos..
ja tentei usar o seguinte comando
ls /dados/nfs/nfs.sh |cut -d '/' -f 4-
ai eu consigo pegar o nfs.sh
so que posso ter o seguinte ls /dir1/dir2/dir3/dir/dir5/arquivo
como fazer para que o -f 4- seja auto ajustavel ??
Grato
--
Eduardo Jaime Quirós Batres (***@ufv.br)
Analista de Tecnologia da Informação
Diretoria de Tecnologia da Informação - UFV
--
Toda verdade passa por três estágios.
No primeiro, ela é ridicularizada.
No segundo, é rejeitada com violência.
No terceiro, é aceita como evidente por si própria.
Arthur Schopenhauer


[As partes desta mensagem que não continham texto foram removidas]
Continue reading on narkive:
Loading...