Mover linha da saída para a frente da saída ou reordenação personalizada

2

Eu tenho um comando find "$PWD" -name __openerp__.py|awk -F/ -vOFS=/ 'NF-=2'|sort -u e eu quero pegar uma certa linha contendo /web/addons e enviá-la para a frente da saída, então faça o mesmo com /openerp/addons fazendo com que a linha com /openerp/addons seja a primeira e linha com /web/addons seria o segundo.

Eu usei o grep com essa entrada e da mesma saída - grep com curinga e excluir, mas ainda assim descobrir como passar a saída do pipe para vários greps. Também há provavelmente várias maneiras de fazer isso.

Então, agora eu recebo:

<my path>/addons
<my path>/development
<my path>/external
<my path>/server/openerp/addons
<my path>/web/addons

E eu quero que isso se torne:

<my path>/server/openerp/addons
<my path>/web/addons
<my path>/addons
<my path>/development
<my path>/external

P.S. Reversão de classificação não irá resolver isso

    
por JackLeo 29.01.2014 / 14:46

3 respostas

0

Agora eu fiz isso salvando em /tmp/ e depois executando grep nela algumas vezes:

find "$PWD" -name '__openerp__.py' | awk -F/ -vOFS=/ 'NF-=2' | sort -u > /tmp/openerp_addon_list.txt ; (egrep '/openerp/addons|/web/addons$' /tmp/openerp_addon_list.txt; egrep -v "/openerp/addons|/web/addons|/openerp/test" /tmp/openerp_addon_list.txt)
/home/domas/Sources/openerp/7.0/server/openerp/addons
/home/domas/Sources/openerp/7.0/web/addons
/home/domas/Sources/openerp/7.0/addons
/home/domas/Sources/openerp/7.0/development
/home/domas/Sources/openerp/7.0/external
/home/domas/Sources/openerp/7.0/groups/account-invoice-report
/home/domas/Sources/openerp/7.0/groups/banking-addons
/home/domas/Sources/openerp/7.0/groups/partner-contact-management
/home/domas/Sources/openerp/7.0/groups/sale-reports
/home/domas/Sources/openerp/7.0/groups/webkit-utils
    
por 29.01.2014 / 15:22
2

Não tenho certeza se entendi o que você está tentando fazer aqui, mas se você quiser que a linha com /openerp/addons seja a primeira e /web/addons seja a segunda, por que não apenas algo assim:

find "$PWD" -name '__openerp__.py' | awk -F/ -vOFS=/ 'NF-=2' | 
  sed 's#^\(.*/openerp/addons.*\)#aaa%#; s#^\(.*/web/addons.*\)#aab%#' | 
   sort -u | sed 's/^aa.%//'

Não é particularmente inteligente ou elegante, mas isso simplesmente adicionará aaa% ao início das linhas que contêm /openerp/addons e aab% ao início das linhas que contêm /web/addons . O último sed os remove novamente após a classificação. Supondo que você não tenha arquivos cujo nome comece com aa.% , isso deve ter o resultado desejado.

Ou, você poderia usar um simples perl one-liner que também faz o trabalho de sort -u :

find fafa/ | awk -F/ -vOFS=/ 'NF-=2' | 
 perl -ne 's#^(.*/openerp/addons)#aaa%$1#; s#^(.*/web/addons)#aab%$1#; $k{$_}++; 
            END{for (sort keys(%k)){s/^aa.%//; print }}'
    
por 29.01.2014 / 16:04
1

Como mencionei em um comentário , pipelines não são o caminho a percorrer; pelo menos não com uma ferramenta tão simples como grep . Eu usaria uma ferramenta mais poderosa, como Python ou Perl, para isso. Aqui está um filtro Perl que pode ajudar:

your command | perl -ne '
    if($already_found_lines){
        print # print the current line as is
    } else{
        if   (m{/web/addons}    ) { $web=$_     and $found_web++    }
        elsif(m{/openerp/addons}) { $openerp=$_ and $found_openerp++}
        else                      { push @buffer,$_                 }
        $already_found_lines = ($found_web and $found_openerp);
        if($already_found_lines)  { print "${openerp}$web";print for @buffer}
    }'

Isso foi testado corretamente com sua entrada de amostra.

    
por 29.01.2014 / 15:19

Tags