Usando sed / awk para recuperar o primeiro “token não-whitspace” em cada linha

1

Eu tenho um grande arquivo de N-Triples / N-Quads
Eu quero ficar com uma coleção de apenas assuntos.
Em arquivos menores eu poderia ter conseguido isso usando:

awk '{print $1}' | uniq

mas awk falha em arquivos grandes linhas . (vários MB).

Como posso conseguir algo semelhante com sed / grep -o / etc '...?

EDITAR:

o awk falha com:

awk: program limit exceeded: maximum number of fields size=32767
    FILENAME="file.nq" FNR=308254 NR=308254
    
por gilad hoch 21.12.2016 / 13:27

3 respostas

2

[update] Algumas linhas possuem muitos campos (separados em branco). Experimente grep em vez de awk :

grep -E -o '^[^[:space:]]+' your_input_file | uniq

Eu recomendaria contra usar sed para isso, já que faria muito trabalho extra em cada linha (para remover o fim da linha) em um arquivo muito grande. Mesmo para awk : a análise de linha é desnecessária.

    
por 21.12.2016 / 13:38
1

com sed :

sed 's/^ *\([^ ]*\) .*$//g' | uniq

Isso substitui cada linha pela primeira sequência de não espaços.

Uma variante mais rápida usando dois grep s (para manipular linhas com espaços iniciais, como o AWK faz):

grep -o "^[[:space:]]*[^[:space:]]*" | grep -o "[^[:space:]]*" | uniq
    
por 21.12.2016 / 13:48
1

Respondendo a pergunta editada, com long lines .

Um truque que você pode usar para este caso é usar tr para trocar espaços e novas linhas. Existem várias maneiras de obter o primeiro registro da primeira linha. Seu problema, então, torna-se um de encontrar linhas que contenham um espaço

 { echo # output a newline to get the first record
   cat file
 } | tr ' \n' '\n ' |
   sed -n '/ /s/.* //p' 

Ou

 tr ' \n' '\n ' < file | sed -ne '1p' -e '/ /s/.* //p'

A ideia é que você mude

this is a long line
and this is another

para

this
is
a
long
line and
this
is
another

Assim, as ferramentas com limites de comprimento de linha não apresentam problemas. Se você tiver caracteres de tabulação entre os campos, provavelmente deseja tr ' \t\n' '\n\n '

    
por 21.12.2016 / 13:58

Tags