Unindo certas linhas de texto antes de modificá-las

0

Eu tenho um comentário de críquete como -

0.3
Richardson to RG Sharma, 2 runs, gentle, non-swinging length ball on off, Rohit seeks to pick it up. Hit high on the bat and spooned over the returning Mitch Marsh at midwicket
0.4
Richardson to RG Sharma, 1 run, banged in short, controlled pull to long leg

O que eu quero fazer é juntar as linhas n.n com as seguintes linhas, substituindo novas linhas por espaços. Então, quero excluir tudo da segunda vírgula até o final de cada linha, para que a saída da entrada acima seja:

0.3 Richardson to RG Sharma, 2 runs
0.4 Richardson to RG Sharma, 1 run

- Editar - Eu usei [0-9] "\ n" [A-Z] para corresponder à nova linha, mas tenho dificuldade em reproduzir o número exato e o caractere que foram correspondidos. Também para excluir tudo após 2 vírgulas, tentei a expansão de parâmetros, mas só consegui que funcionasse para excluir após uma única vírgula.

    
por Naman Jain 08.02.2016 / 03:50

2 respostas

2

Você pode usar sed :

sed -ne '/^[0-9][0-9]*\.[0-6]/ { N; s/\n/ /; s/^\([^,]*,[^,]*\),.*$//; p; }' < data

Isso processa um arquivo chamado data , suprimindo a impressão, a menos que seja solicitado ( -n ) e executando o programa sed entre aspas.

Esse programa seleciona linhas que começam com um ou mais dígitos, um . e um dígito 0-6 e, em seguida, executa a peça em {} para essas linhas. O N command lê a próxima linha também, com uma nova linha no meio. O primeiro s/// substitui essa nova linha por um espaço.

O segundo combina a nova linha única até a segunda vírgula e substitui toda a linha apenas pela primeira parte. Ele captura um \( group \) com uma sequência de caracteres não-vírgula, uma vírgula e outra sequência de caracteres não-vírgula, todos seguidos por uma vírgula e qualquer texto .* até o final da linha $ .

p imprime a linha resultante. Todas as outras linhas de entrada são ignoradas.

    
por 08.02.2016 / 04:50
0

Uma solução alternativa no AWK:

awk -v FS="," '/^[0-9]/{line=$0;getline; line=line" "$1", "$2 ;print line}' file
    
por 08.02.2016 / 14:43