exibir linhas com não mais que 4 palavras na segunda coluna

3

Eu tenho uma tabela de símbolos no formulário

M07UP49A0870I422.wav    <s> haraa keelaa <bn> </s>
M07UP49A0870I423.wav    <s> <horn> jau <babble>  </s>
M07UP49A0861C86105.wav  <s> waa khaada aadi kaa upayoga laabhadaayaka paaya gayaa hai  </s>
M07UP49A0861C86106.wav  <s> aadi kisaan apnee stara para bhii taiyaara kara sakatee hai </s>
M07UP49A0861C86107.wav  <s> kii gobara kaa upayoga kandxee banaakara iindhana kee ruupa mee kiyaa jaata hai <bang> </s>
M07UP49A0861C86108.wav  <s> geehuun kii phasala kii katxaayii kee baada <horn> kheeto ko aaga lagaakara saapha kiyaa jaata hai <babble> </s>
M07UP49A0861C86109.wav  <s> badxqii maatraa mee jiiwaanqu jalakara nashtxa ho jaataa hai <babble> </s>

Como evidente, este arquivo contém duas colunas. A primeira coluna é o nome do arquivo de áudio (com extensão .wav) e a segunda coluna é a transcrição do arquivo de áudio

A segunda coluna deve conter no máximo 4 palavras (excluindo tags; tags são as palavras escritas em < >).

Por exemplo, considere a segunda linha. Esta linha tem apenas uma palavra, ou seja, jau (note que

<s> 
</s> 
<babble> 
<horn> 

não estão incluídos na contagem de palavras desta linha porque são tags).

Em essência, em qualquer linha, uma palavra na segunda coluna é uma string não cercada por < >.

Agora, meu trabalho é descobrir apenas as linhas que não têm mais de quatro palavras na segunda coluna.

Eu usei os seguintes comandos,

gawk 'NF>4' file > output

mas não obteve os resultados.

Para sua conveniência, aqui está o resultado esperado

M07UP49A0870I422.wav    <s> haraa keelaa <bn> </s>
M07UP49A0870I423.wav    <s> <horn> jau <babble>  </s>

Eu obtive a seguinte saída porque a segunda coluna continha apenas duas palavras, ou seja, haraa e keelaa e a segunda linha consistia em apenas uma palavra, ou seja, jau.

Além destas linhas, as linhas consistiam em mais de 4 palavras na segunda coluna.

    
por Upendra Pratap Singh 11.02.2016 / 10:05

4 respostas

2

Poderia ser feito com um pequeno script python:

#!/usr/bin/env python3
import sys

for l in open(sys.argv[1]).readlines():
    l = l.strip()
    print(l) if len([s for s in l.split("<s>")[-1].split()
             if not all([s.startswith("<"), s.endswith(">")])]) <= 4 else ("")

Supondo que você tenha python3 instalado:

  • Copie-o em um arquivo vazio, salve-o como get_colls.py
  • Execute-o com o arquivo como argumento:

    python3 /path/to/get_colls.py <file>
    

Saída no exemplo:

M07UP49A0870I422.wav    <s> haraa keelaa <bn> </s>
M07UP49A0870I423.wav    <s> <horn> jau <babble>  </s>

Explicação

O script:

  • divide a linha pelo delimitador <s>
  • na segunda seção, conta as strings, não começando com < e terminando com >
  • imprime as linhas com comprimento <= 4
por 11.02.2016 / 10:45
3

O seguinte script AWK salva a linha original em x, exclui todas as tags e, em seguida, conta o número de palavras (menos 1 para descontar o nome do arquivo no primeiro campo). Se a contagem de palavras for menor que 5, imprime a linha original:

awk '{x=$0; gsub(/<[^>]*>/, "")} NF-1<5 {print x}' filename
    
por 11.02.2016 / 12:04
2

Usar o awk é provavelmente o melhor aqui, já que permite expressar seu pensamento com clareza (remover as tags, deve haver no máximo 4 palavras restantes, não incluindo a primeira coluna). Mas você também pode fazer isso com o grep, já que é apenas uma questão de filtrar linhas e o filtro pode ser descrito por uma expressão regular.

grep -vE '^ *[^ ]+((<[^>]*>| )+[^<> ]+){5}'
  • -v : excluir linhas correspondentes
  • -E : use a sintaxe de expressão regular estendida
  • ^ *[^ ]+ corresponde à primeira palavra no início da linha
  • (…){5} significa 5 ou mais do que está entre parênteses
  • (<[^>]*>| )+ corresponde a uma sequência não vazia de espaços e tags
  • [^<> ]+ corresponde a uma palavra sem tag
por 12.02.2016 / 01:44
0

Este comando deve funcionar:

awk -F "wav" '{print $2}' file | awk '{gsub("<[^>]*>", "")}1' | awk 'NF<4'

    
por 11.02.2016 / 10:33