Separe as “linhas duplicadas” pela linha vazia

1

Minha entrada é algo assim:

fruit  apple word
fruit  lemon
fruit  orange other word
meat  ham word
vegetable  salad other
vegetable  lettuce more

Como posso separar linhas duplicadas por uma linha vazia, com base na primeira palavra? Assim:

fruit  apple word
fruit  lemon other word
fruit  orange word

meat ham word

vegetable  salad other
vegetable  lettuce more

Edit: Esqueci de mencionar que é possível ter espaços após a primeira palavra.

    
por Matteo 09.10.2016 / 17:21

3 respostas

1

Aqui está um comando básico que você pode adaptar às suas necessidades individuais.

awk '{print $0 > $1}' inputfile

EDIT: desculpas, eu só percebi que eu interpretei mal a sua pergunta, esta não é a resposta correta, embora você possa 'reingressar' os arquivos com as linhas em branco facilmente o suficiente

Aqui está uma possível solução

for file in $(awk '{print $1; print $0 > $1}' data.txt | sort | uniq)
do
  cat $file
  echo
  rm $file
done > output.txt

Solução apenas usando o awk, se o arquivo estiver pré-classificado:

awk '{a=$1; if (b != "" && a != b) {printf "\n";}; print $0; b = a}' inputfile

Retrabalhada após comentários de don_crissti (obrigado!)

awk '{if (a != "" && a != $1) {printf "\n";}; print $0; a = $1}' inputfile
    
por 09.10.2016 / 17:43
1

A solução sed pode ser

sed '
    /^\n/!{                             #if line do not starts from \newline 
        N                               #attach next line
        /^\(\w\+\b\).*\n/! s/\n/\n\n/ #if 1st word not a same insert \newline
    }
    P                                   #print 1st line (before \newline)
    D                                   #remove 1st line, return to start
    '
    
por 09.10.2016 / 18:20
1

outra awk solution, assume entrada classificada como mostrado na entrada de amostra

$ cat ip.txt 
fruit  apple word
fruit  lemon
fruit  orange other word
meat  ham word
vegetable  salad other
vegetable  lettuce more

Nota: a ordem de verificação de condições é importante.

$ awk '!seen[$1]++ && NR>1{printf "\n"} 1' ip.txt 
fruit  apple word
fruit  lemon
fruit  orange other word

meat  ham word

vegetable  salad other
vegetable  lettuce more


Solução semelhante em perl

$ perl -ane 'print "\n" if !$seen{$F[0]}++ && $. > 1; print' ip.txt 
fruit  apple word
fruit  lemon
fruit  orange other word

meat  ham word

vegetable  salad other
vegetable  lettuce more
    
por 09.10.2016 / 18:21