Se houver mais de um número x de canais em uma linha csv, exclua a segunda instância

3

Eu tenho um arquivo csv que deve conter 4 colunas de dados que incluem um número de produto, um título, um URL e um preço. Cada coluna é separada por um delimitador | (isso precisa ser mantido, há outros motivos pelos quais não posso alternar para um delimitador alternativo que não entro aqui). Como pode ser visto na entrada inferior (que é a entrada do problema neste exemplo), o título contém um canal, que quebra o padrão, o que poderia causar problemas se os dados precisarem ser importados para um banco de dados.

5456435121|The making of the blue album|https://www.example1.co.uk|55
1321354567|Wow this example has no imagination|https://www.cherrypickers.co.uk|89
5456456456|King of the Barbarians | Last Man Standing|https://www.babarians.co.uk|79

O que eu gostaria de saber é, como posso executar um comando que analise efetivamente o arquivo, e para cada linha onde há mais de 3 canais (ou seja, cada linha onde o título contém um pipe), em seguida, exclua o segundo um nessa linha. Isso efetivamente me permitiria remover o (s) cano (es) no título se houver um ou mais presentes. Eu não sei como conseguir isso.

Eu gostaria que o arquivo fosse assim depois de processado:

5456435121|The making of the blue album|https://www.example1.co.uk|55
1321354567|Wow this example has no imagination|https://www.cherrypickers.co.uk|89
5456456456|King of the Barbarians Last Man Standing|https://www.babarians.co.uk|79
    
por neilH 05.05.2016 / 13:15

1 resposta

2
sed -r ':;s/(\|.*)\|(.*\|.*\|)//;t'

Exclui todos os canais que são precedidos por um e seguidos por dois canais.

Se você quiser editar o arquivo, use a opção -i .

    
por 05.05.2016 / 13:56