Eu tenho que ter uma lista (cargas) de endereços IP neste formato:
134.27.128.0
111.245.48.0
109.21.244.0
e transformá-los nesse formato com um tubo intermediário (IPs compostos)
134.27.128.0 | 111.245.48.0 | 109.21.244.0 | 103.22.200.0/22
Eu acho que é um comando de localização e substituição, sed
mas não consigo fazê-lo funcionar.
shell
text-processing
uselesslinuxman
fonte
fonte
tr
incluir novas linhas em|
pipes? Gosta<ipfile tr \\n \| >outfile
?|
necessário?<
. Então<mydoc tr \\n \| >mydoc2
. Mas isso não vai lhe dar espaço. Para aqueles, provavelmente a solução mais rápida épaste -d' | ' mydoc /dev/null /dev/null >mydoc2
paste
escreve linhas correspondentes a cada arquivo. Sem-s
, você receberá de volta o número de linhas que possui no arquivo.Respostas:
Usando sed, com base em famosos Sed one-liners explicou, Parte I: : 39. Anexar uma linha para a próxima se ele termina com uma barra invertida "\" (exceto aqui vamos ignorar a parte sobre a barra invertida, e substituir as
\n
quebras de linha com o|
separador necessário ):deve produzir em
mydoc2
fonte
sed 'H;1h;$!d;x;s/\n/ | /g'
é linear.sed
espaço padrão de 8K; isso é muito menos que 16 milhões.Fiquei curioso para ver como algumas dessas (+ algumas alternativas) funcionam em velocidade com um arquivo bastante grande (
163MiB
, umIP
por linha, ~ 13 milhões de linhas):Resultados (com
sync; echo 3 > /proc/sys/vm/drop_caches
após cada comando; repeti os testes - em ordem inversa - após algumas horas, mas as diferenças eram insignificantes; observe também que estou usandognu sed
):chave de aço :
muito lento. Abortado após dois minutos de espera ... então não há resultado para este.
cuonglm :
mikeserv :
jthill :
Avinash Raj :
e
val0x00ff :
cujos meios
184.321s
. Sem surpresa, isso é 200 vezes mais lento que a solução da mikeserv .Aqui estão algumas outras maneiras com o
awk:
perl:
xargs:
uma combinação de cabeça + colar + tr + gato:
Se você possui
GNU coreutils
e se sua lista de IPs não é realmente grande (digamos até 50000 IPs), você também pode fazer isso compr
:Onde
por exemplo, para um arquivo de 6 linhas:
o comando:
saídas:
fonte
while ... read
loop? Estou curioso para ver o que 163kread()
ewrite()
chamadas traduz em uma referência. Ótima resposta, a propósito.sed
parece ter melhorado sua posição naquele tempo (e provavelmente teve apenas poucas alterações em seu mecanismo de regexp), masgrep
parece ter sofrido um atraso dramático no desempenho (especialmente nas linhas mais longas) ? Gostaria de saber se asperl
adições ao seu motor têm alguma influência sobre esses resultados ... Também é interessante quedash
não seja abismal . Obash
aqui provavelmente seria muito mais lento com o comumIFS=
precedido.lex
corretamente.Você pode usar o awk :
ORS=' | '
defina o separador de registro de saída como em' | '
vez de nova linha.ou edite no local com
perl
:fonte
paste
funciona. muito apreciado.paste
solução é a mais rápida.ORS=""
dentro doEND
bloco comORS="\n"
para que ele faça.Então eu entendi tudo errado - e essa pergunta me ensinou muito
paste
. Como o cuonglm observa corretamente, a menos que você estejapaste
em um arquivo em-s
série, você sempre terminará com a última\n
linha de ew da sua lista de infile sendo anexada à saída conforme está escrita. Eu estava enganado na crença de que opaste -s
comportamento era seu modo padrão - e esse é um equívoco que, aparentemente,busybox
paste
ficou feliz em reforçar. O comando a seguir funciona como anunciado combusybox
:Porém, ele não funciona de acordo com as especificações. Uma implementação correta
paste
ainda acrescentaria um\n
ewline à direita para cada sequência gravada. Ainda assim, isso não é grande coisa, afinal:fonte
pr
em mente, mas aparentemente ele fica sem vapor com grandes arquivos de entrada, então não pude testar a velocidade, mas com arquivos de tamanho razoável, funciona bem. Sua solução é de longe a mais rápida (sem surpresa -paste
é realmente rápida), veja o meu post.uma linha com tr e sed:
fonte
Utilize
vim
:Explicação:
-n
desativar arquivo de troca-u NONE
é usado para pular todas as inicializações.-c {command}
executar comandos após a leitura do arquivo.1,$-1s/\n/ | /g
és/\n/ | /g
(substitua a nova linha pelo espaço do tubo de espaço) para o intervalo1,$-1s
(1ª a última linha - 1)wq!
força escrever e sairNota:
Dependendo do tamanho do seu arquivo, isso pode ser uma má idéia.
fonte
Através de python.
espaços antes
print
era muito importante.fonte
Aqui está outro usando
xxd
fonte
Por uma questão de completude, aqui está outra
awk
solução baseada em: esta não está usando aORS
:Para uma explicação, consulte meu post em /unix//a/338121/117599 .
fonte