Como removo a parte desnecessária deste arquivo?

3

Eu tenho este arquivo .scp que contém o comando completo necessário para converter vários arquivos.

Esses arquivos foram gerados por um script diferente, para uma finalidade diferente, mas agora eu preciso converter vários arquivos.

O problema é que cada arquivo começa com o nome do arquivo dos arquivos sendo convertidos, o que não funcionaria quando eu quisesse executá-lo ..

Como faço para remover o primeiro arquivo, de modo que eu possa converter todos os arquivos, tão fácil quanto executar um script?

Aqui está um exemplo de como o texto no arquivo é formatado.

fcaw-b-an406 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an406-fcaw-b.sph |
fcaw-b-an407 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an407-fcaw-b.sph |
fcaw-b-an408 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an408-fcaw-b.sph |
fcaw-b-an409 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an409-fcaw-b.sph |
fcaw-b-an410 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an410-fcaw-b.sph |
fcaw-b-cen1 /home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/cen1-fcaw-b.sph |...

Saída desejada

/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an406-fcaw-b.sph |
/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an407-fcaw-b.sph |
/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an408-fcaw-b.sph |
/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an409-fcaw-b.sph |
/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/an410-fcaw-b.sph |
/home/k/kaldi-trunk/egs/start/s5/data/../../../../tools/sph2pipe_v2.5/sph2pipe -f wav -p -c 1 /home/k/kaldi-trunk/egs/start/s5/data/train/fcaw/cen1-fcaw-b.sph |...
    
por Bob Burt 01.10.2016 / 20:04

1 resposta

5

Muitas maneiras:

  • grep com PCRE ( -P ):

    grep -Po '^[^\s]+\s+\K.*' file.txt
    
    • ^[^\s]+\s+ corresponde ao primeiro campo junto com espaço em branco à direita, \K descarta a correspondência e, em seguida, .* corresponde ao restante da linha e é impresso
  • sed :

    sed -E 's/^[^[:blank:]]+[[:blank:]]+//' file.txt
    
    • ^[^[:blank:]]+[[:blank:]]+ corresponde ao primeiro campo, novamente com o (s) espaço (s) em branco à direita e é substituído por uma string vazia
  • awk :

    awk -F "[[:blank:]]+" '{$1=""; print substr($0, 2)}' file.txt
    
    • -F "[[:blank:]]+" define o separador de campo como um ou mais espaços em branco, $1="" define o primeiro campo como string vazia, isso introduz um espaço em branco na frente, então precisamos fazer o fatiamento de string com substr ($ 0, 2) 'para obter caracteres a partir do segundo
  • cut :

    cut -d" " -f2- file.txt
    
    • -d" " define o delimitador como espaço e -f2- imprime os campos a partir do segundo
  • bash :

    while read -r _ desired; do echo "$desired"; done <file.txt
    
    • Ler cada linha e definir o primeiro campo como variável de distribuição _ , desired contém a parte restante e é impresso em echo "$desired"
  • perl :

    perl -pe 's/^[^\s]+\s+//' file.txt
    
    • Lógica semelhante ao sed one
  • python :

    #!/usr/bin/env python
    with open('file.txt') as f:
        for line in f:
            print line.split(' ', 1)[1]
    
    • Ler cada linha e line.split(' ', 1) irá split no espaço com um máximo de 1 operação de divisão, portanto o índice 0 conterá a primeira palavra e o índice 1 terá a parte desejada (ou seja, da segunda palavra até fim)
por heemayl 01.10.2016 / 20:19