Jak mogę losowo zastąpić określone ciągi w jednym pliku tekstowym ciągami z innego pliku? Na przykład:
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
źródło
źródło
Odpowiedzi:
Jeśli naprawdę chcesz losowego wyboru, oto jeden ze sposobów
awk
:OTOH, jeśli chcesz losową permutację adresów, sugerowałbym coś takiego
źródło
paste
ale nie przyszło mi do głowy,cut
aby usunąć niepasujące pole.<(sort -R file2.txt)
możemy użyć czegoś takiego<(yes "$(<file2.txt)" | head -n $(wc -l < file1.txt) | sort -R)
- może to wypaczyć losowość na korzyść linii bliżej góry pliku2.Możesz zaimplementować ten algorytm:
file2.txt
do tablicyfile1.txt
:Lubię to:
(Specjalne podziękowania dla @GlennJackman i @dessert za ulepszenia.)
źródło
mapfile -t addresses < file2.txt
- używaniecat
takich tematów dzieli cię na słowa i rozwija nazwy plików.file1.txt
jeśli ten plik nie kończy się pustą linią (przepraszam, w tej chwili nie można przetestować)? Jeśli nie, zalecamwhile IFS='' read -r orig || [[ -n "$orig" ]]; do
, zobacz Odczytywanie pliku wiersz po wierszu, przypisując wartość do zmiennej · SO .Możesz użyć
shuf
(może być to koniecznesudo apt install shuf
), aby przetasować linie drugiego pliku, a następnie użyć ich do zamiany:shuf
po prostu losuje kolejność linii wejściowych.awk
Komenda będzie najpierw przeczytać cały plik1 (NR==FNR
będzie tylko prawda, podczas gdy pierwszy plik jest odczytywany) i zapisuje drugie pole (pola są zdefiniowane@
, więc jest to domena) w tablicy asocjacyjneja
, których wartości są domeny i których klucze to numery linii. Następnie, gdy przejdziemy do następnego pliku, po prostu wydrukuje to, co było zapisanea
dla tego numeru linii, wraz z tym, co znajduje się w pliku 2 dla tego samego numeru linii.Zauważ, że zakłada to, że oba pliki mają dokładnie taką samą liczbę linii i tak naprawdę nie są „losowe”, ponieważ nie pozwalają na powtórzenie niczego. Ale wygląda na to, o co chciałeś poprosić.
źródło
Rozwiązanie Python 2.7 i 3
To rozwiązanie zastępuje pierwsze wystąpienie pojedynczego podanego ciągu („igły”) w każdym wierszu pliku wejściowego ciągiem wybranym za każdym razem losowo z zestawu wierszy listy ciągów zamienników.
Zakotwiczenie igły na początku lub na końcu łańcucha lub użycie wyrażeń regularnych powinno być prawie trywialne.
Stosowanie
Przykład:
lub
źródło
Oto perlowy sposób:
źródło
Kolejne rozwiązanie bash. Używa wbudowanej funkcji zamiany napisów bash. Zakłada również, że
file2.txt
zawiera tylko ciągi zastępujące. Jeśli nie, można je najpierw przefiltrować za pomocągrep -o <replace> file2.txt
Z
shuf
Bez
shuf
(prawie czystybash
)Tutaj musimy najpierw stworzyć funkcję, która naśladuje
shuf
takTo jest podobne
Test:
źródło