Как я могу произвольно заменить определенные строки в одном текстовом файле на строки из другого файла? Например:
file1.txt(file has more than 200 lines):
moonwalker@address.com
hansolo@address.com
anakinskywalker@address.com
obiwankenobi@address.com
darthvader@address.com
file2.txt(file has 10-20 lines):
@adress1.com
@adress2.com
@adress3.com
@adress4.com
@adress5.com
output.txt:
moonwalker@address4.com
hansolo@address1.com
anakinskywalker@address5.com
obiwankenobi@address2.com
darthvader@address3.com
command-line
text-processing
elanozturk
источник
источник
Ответы:
Если вы действительно хотите случайный выбор, то вот один из способов использования
awk
:OTOH, если вы хотите случайную перестановку адресов, я бы предложил что-то вроде
источник
paste
но мне не пришло в голову, чтобы использоватьcut
для удаления несоответствующего поля.<(sort -R file2.txt)
мы можем использовать что-то вроде<(yes "$(<file2.txt)" | head -n $(wc -l < file1.txt) | sort -R)
- это может исказить случайность в пользу строк ближе к вершине файла2.Вы можете реализовать этот алгоритм:
file2.txt
в массивfile1.txt
:Нравится:
(Отдельное спасибо @GlennJackman и @dessert за улучшения.)
источник
mapfile -t addresses < file2.txt
помощью -cat
таким образом вы подвергаетесь разделению слов и расширению имени файла.file1.txt
если этот файл не заканчивается пустой строкой (извините, не могу проверить в данный момент)? Если нет, я рекомендуюwhile IFS='' read -r orig || [[ -n "$orig" ]]; do
, см. Чтение файла построчно, присваивая значение переменной · SO .Вы можете использовать
shuf
(вам может понадобитьсяsudo apt install shuf
) перетасовать строки второго файла, а затем использовать их для замены:shuf
просто рандомизирует порядок своих входных строк. Тамawk
команда сначала прочитает весьNR==FNR
файл file1 ( будет истинно только во время чтения первого файла) и сохранит второе поле (поля определены@
, так что это домен) в ассоциативном массивеa
, значениями которого являются домены и чьи ключи являются номерами строк. Затем, когда мы перейдем к следующему файлу, он просто напечатает все, что было сохраненоa
для этого номера строки, вместе с тем, что находится в файле 2 для того же номера строки.Обратите внимание, что это предполагает, что оба файла имеют одинаковое количество строк и на самом деле не являются «случайными», так как не допускают повторения чего-либо. Но это похоже на то, что вы хотели попросить.
источник
Решение Python 2.7 и 3
Это решение заменяет первое вхождение одной произвольной заданной строки («иглы») в каждой строке входного файла строкой, каждый раз выбираемой случайным образом из набора строк списка строк замен.
Это должно быть почти тривиально, чтобы привязать иглу к началу или концу строки или использовать регулярные выражения в целом.
Применение
Пример:
или
источник
Вот способ Perl:
источник
Другое решение Bash. Он использует встроенную функцию замены строк в bash. Также предполагается, что
file2.txt
содержит только строки замены. Если нет, то их можно сначала отфильтровать, используяgrep -o <replace> file2.txt
С
shuf
Без
shuf
(почти чистыйbash
)Здесь мы должны сначала создать функцию, которая подражает
shuf
такТогда похоже
Тестовое задание:
источник