Como posso substituir aleatoriamente cadeias específicas em um arquivo de texto por cadeias de outro arquivo? Por exemplo:
file1.txt(file has more than 200 lines):
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
file2.txt(file has 10-20 lines):
@adress1.com
@adress2.com
@adress3.com
@adress4.com
@adress5.com
output.txt:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
command-line
text-processing
elanozturk
fonte
fonte
Respostas:
Se você realmente deseja uma seleção aleatória, aqui está uma maneira de usar
awk
:OTOH, se você quiser uma permutação aleatória dos endereços, sugiro algo como
fonte
paste
mas não me ocorreu usarcut
para remover o campo não correspondente.<(sort -R file2.txt)
usarmos algo como<(yes "$(<file2.txt)" | head -n $(wc -l < file1.txt) | sort -R)
- que pode distorcer a aleatoriedade em favor de linhas mais próximas do topo do arquivo2.Você pode implementar este algoritmo:
file2.txt
em uma matrizfile1.txt
:Como isso:
(Agradecimentos especiais a @GlennJackman e @dessert pelas melhorias.)
fonte
mapfile -t addresses < file2.txt
- usandocat
dessa forma sujeita você à divisão de palavras e à expansão do nome do arquivo.file1.txt
se esse arquivo não terminar com uma linha vazia (desculpe, não é possível testar no momento)? Caso contrário, recomendowhile IFS='' read -r orig || [[ -n "$orig" ]]; do
, consulte Ler um arquivo linha por linha atribuindo o valor a uma variável · SO .Você pode usar
shuf
(talvez seja necessáriosudo apt install shuf
) para embaralhar as linhas do segundo arquivo e usá-las para substituir:shuf
simplesmente randomiza a ordem de suas linhas de entrada. Oawk
comando lá primeiro lerá todo o arquivo1 (NR==FNR
será verdadeiro somente enquanto o primeiro arquivo estiver sendo lido) e salva o segundo campo (os campos são definidos por@
, portanto esse é o domínio) no array associativoa
cujos valores são os domínios e cujas teclas são os números de linha. Então, quando chegarmos ao próximo arquivo, ele simplesmente imprimirá o que foi armazenadoa
para esse número de linha, juntamente com o que está no arquivo 2 para o mesmo número de linha.Observe que isso pressupõe que os dois arquivos têm exatamente o mesmo número de linhas e não está sendo "aleatório", pois não permitirá que nada seja repetido. Mas isso parece com o que você queria pedir.
fonte
Solução Python 2.7 e 3
Esta solução substitui a primeira ocorrência de uma única sequência arbitrária especificada (a “agulha”) em todas as linhas do arquivo de entrada por uma sequência sempre escolhida aleatoriamente no conjunto de linhas da lista de sequências de substituições.
Deve ser quase trivial ancorar a agulha no início ou no final da corda ou usar expressões regulares por completo.
Uso
Exemplo:
ou
fonte
Aqui está uma maneira perl:
fonte
Outra solução do bash. Ele usa o recurso de substituição de string incorporado do bash. Ele também assume que
file2.txt
contém apenas as seqüências de substituição. Caso contrário, eles podem ser filtrados primeiro usandogrep -o <replace> file2.txt
Com
shuf
Sem
shuf
(quase purobash
)Aqui temos que criar primeiro uma função que imita
shuf
assimEntão é semelhante
Teste:
fonte