Esta é a minha primeira pergunta sobre codegolf, por isso peço desculpas antecipadamente, se não for apropriado, e agradeço qualquer feedback.
Eu tenho um arquivo com este formato:
a | rest of first line
b | rest of second line
b | rest of third line
c | rest of fourth line
d | rest of fifth line
d | rest of sixth line
O conteúdo real varia, assim como o delimitador. O conteúdo é apenas texto. O delimitador aparece apenas uma vez por linha. Para este quebra-cabeça, fique à vontade para alterar o delimitador, por exemplo, use "%" como delimitador.
Saída desejada:
a | rest of first line
b | rest of second line % rest of third line
c | rest of fourth line
d | rest of fifth line % rest of sixth line
Eu já tenho scripts ruby e awk para mesclar isso, mas suspeito que é possível ter um pequeno oneliner. isto é, uma linha que pode ser usada junto com pipes e outros comandos na linha de comando. Não consigo descobrir, e meu próprio script é muito longo para compactar na linha de comando.
Caracteres menores preferidos. A entrada não é necessariamente classificada, mas estamos interessados apenas em mesclar linhas consecutivas com os primeiros campos correspondentes. Existem linhas ilimitadas com os primeiros campos correspondentes. O campo 1 pode ser qualquer coisa, por exemplo, nomes de frutas, nomes próprios, etc.
(Eu corro no MacOS, por isso estou pessoalmente mais interessado em implementações que são executadas no mac).
Aqui está um segundo exemplo / teste. Observe "|" é o delimitador. O espaço antes do "|" é irrelevante e se o ressentimento deve ser considerado parte da chave. Estou usando "%" como delimitado na saída, mas, novamente, sinta-se à vontade para alterar o delimitador (mas não use colchetes).
Entrada:
why|[may express] surprise, reluctance, impatience, annoyance, indignation
whom|[used in] questions, subordination
whom|[possessive] whose
whom|[subjective] who
whoever|[objective] whomever
whoever|[possessive] whosever
who|[possessive] whose
who|[objective] whom
Saída desejada:
why|[may express] surprise, reluctance, impatience, annoyance, indignation
whom|[used in] questions, subordination%[possessive] whose%[subjective] who
whoever|[objective] whomever%[possessive] whosever
who|[possessive] whose%[objective] whom
fonte
["A|some text", "B|other text", "A|yet some other text"]
não é uma entrada desejada para teste, pois as palavras-chave paraA
não são uma após a outra na lista.Respostas:
Retina , 17 bytes
Marcado em bytes codificados ISO 8859-1.
Usa em
;
vez de|
como o separador do campo de entrada.Experimente online.
fonte
V ,
1613 bytesExperimente online!
Você disse
Então eu escolhi
|
como delimitador. Se isso for inválido, informe-me e eu o alterarei.Explicação:
fonte
Perl
-0n
, 2 + 43 = 45 bytesDemo:
fonte
SQL (PostgreSQL),
4372 bytesIsso tira proveito da útil função agregada string_agg no PostgreSQL. A entrada é de uma tabela chamada
T
com 2 colunasA
eB
. Para melhor atender à pergunta, incluí o comando para carregar dados de um arquivo na tabela. O arquivo também estáT
. Não contei a instrução de criação da tabela.A saída será desordenada, mas se for um problema, poderá ser corrigida com um
ORDER BY A
O SQLFiddle não queria jogar para mim, mas é isso que recebo na minha instalação.
fonte
C, 127 bytes
Funciona com o gcc. Delimitador alterado para
/
. Pega a entrada do stdin e grava a saída no stdout, então chame com o redirecionamento de entrada./a.out <filename
Ungolfed:
fonte
Pitão - 15 bytes
Fazer algumas suposições sobre o problema mudará quando o OP esclarecer.
Experimente online aqui .
fonte
Python 3 - 146 bytes
Entrada é o nome do arquivo ou o caminho do arquivo, a saída é para stdout. Poderia ser muito menor se eu pudesse receber a entrada como texto bruto da linha de comandoLeva a entrada de stdin e as saídas para stdin. Instalação com separador
"|"
. Para testar a primeira entrada de exemplo, use o separador" | "
fonte
Java 7, 167 bytes
Provavelmente, pode ser jogado mais usando uma abordagem diferente.
NOTA: O método acima cria e retorna a
HashMap
com os pares de valores-chave desejados. No entanto, ele não é impresso na saída exata, como na pergunta do OP,|
como delimitador de saída entre as chaves e os novos valores. A julgar pela resposta SQL do MickeyT, onde ele retornou uma tabela de banco de dados, imaginei que isso fosse permitido; se não for necessário adicionar mais bytes para uma função de impressão.Ungolfed & código de teste:
Resultado:
fonte
PowerShell, 85 bytes
Strings são mescladas usando hashtable:
Exemplo
Como o PowerShell não oferece suporte ao redirecionamento stdin via
<
, suponho queGet-Content .\Filename.txt |
será usado como método de E / S padrão.Resultado
fonte
APL, 42 caracteres
fonte
⌸
não é um byte na codificação APL.Sed, 55 bytes
Execução de teste:
fonte
q / kdb +, 46 bytes
Solução:
Exemplo:
Explicação:
fonte