Comando awk / sed para cortar vários delimitadores [closed]

0

Eu tenho o nome do arquivo de entrada como:

Sample_0000860156-001-out_20150224150524.xml.gz

Eu quero apenas 0000860156-001 do file_name para acrescentar ao meu nome de arquivo de destino.

    
por Niraj 27.02.2015 / 11:24

3 respostas

7

Aqui estão algumas abordagens. Você não explicou o que você quer fazer com a string que você deseja extrair, então vou apenas imprimi-lo.

  1. awk com vários delimitadores

    echo Sample_0000860156-001-out_20150224150524.xml.gz | 
     awk -F '[_-]' '{print $2"-"$3}'
    
  2. GNU grep

    echo Sample_0000860156-001-out_20150224150524.xml.gz | grep -oP '_\K.*(?=-)'
    
  3. sed

    echo Sample_0000860156-001-out_20150224150524.xml.gz | 
      sed 's/.*_\([0-9]*-[0-9]*\)-.*//'
    
  4. Perl

    echo Sample_0000860156-001-out_20150224150524.xml.gz | 
     perl -pe 's/.*_(.+?-.+?)-.*//'
    

    Ou, com versões recentes do perl (obrigado @ksenoy ):

    echo Sample_0000860156-001-out_20150224150524.xml.gz | 
     perl -aF/[_-]/ -lne 'print $F[1]-$F[2]'
    
  5. cut

    echo Sample_0000860156-001-out_20150224150524.xml.gz | 
      cut -d_ -f2 | cut -d- -f1,2
    
por 27.02.2015 / 12:08
1

Isso criará um novo arquivo vazio para cada * .gz no diretório que mantém o padrão do exemplo :

touch $(ls *.gz | awk -F '_' {'print $2'} | awk -F "-out" {'print $1'})

ou como sugerido por Jidder :

touch $(ls *.gz | awk -F '_|-out' {'print $2'})
    
por 27.02.2015 / 11:44
0

Usando o GNU awk com correspondência

awk 'match($0,/_([0-9]+-[0-9]+)/,a){print "file."a[1]".gz"}' <<< "$FILENAME"

Ouptut

file.0000860156-001.gz
    
por 27.02.2015 / 12:02

Tags