LINUX.ORG.RU

Помогите написать скрипт на bash

 


0

1

Здравствуйте. Есть два текстовых файла: file_1.txt и file_2.txt

file_1.txt содержит строки: Мария Виктор Анна Дмитрий

file_2.txt содержит строки: Дмитрий Сергей Анна Василий

Мне нужно в новый файл file_3.txt записать строки из file_2.txt, которых нет в файле file_1.txt

Возможно это просто сделать средствами bash linux?


Возможно это просто сделать средствами bash linux?

Да.

Shushundr ()

начни с малого
hxxps://www.google.com/search?q=bash conditional expression

anonymous ()

Да, возможно, но если в каком-то файле будет имя Владимир - скрипт сломается же.

Anoxemian ★★★★★ ()
Ответ на: комментарий от anonymous

Подскажите лучше, чем сделать shuf для большого файла, который не влазит в память? https://github.com/alexandres/terashuf есть ли что то лучше?

Правильно ли я понял, что там берется K строк и только этими кусками шафлит?

vodz ★★★★★ ()
Ответ на: комментарий от vodz

terashuf shuffles as follows:

Divide N input lines into K files containing L lines.

Shuffle each of the K files (this is done in memory before writing the file).

Sample one of the K files where the probability of drawing a file is proportional to the number of lines remaining in the file.

Pop the first line from the sampled file and write it to output.

Repeat 3-4 until all lines have been written to output.

А какие ещё есть решения этой задачи, если данные не влезают в память? Я серьезно, часто такое нужно.

Ещё был бы признателен за совет, как из таких файлов оптимально выкидывать дубли строк, а то sort -u тормозит очень.

anonymous ()
Ответ на: комментарий от AlCat

Чем не подошёл вариант с grep? Нужно именно на bash?

anonymous ()
Ответ на: комментарий от anonymous

А какие ещё есть решения этой задачи, если данные не влезают в память? Я серьезно, часто такое нужно.

Вы не поверите, но шафлить можно было и на 64k памяти. Если не влезают в память offset-ы строк, то тогда свопили память под offset-ы. Но сейчас же ничего не надо, mmap-ите файл, сколько система сможет, столько памяти вам под это дело и закеширует, вам даже ничего делать специально не надо.

vodz ★★★★★ ()
Ответ на: комментарий от anonymous

Алгоритм вроде такой будет, если не ошибаюсь:

  1. Построчно читаем файл.
  2. Сохраняем позиции начала строк в массив
  3. Случайным образом дергаем строки из файла, пока массив не кончится.

Примерно так? Попробую накостылять на каком-нибудь питоне (повторюсь, я не программист).

Хотя наверняка это уже кто-то написал, но я не нашел.

А про уникализацию (чтоб дублей строк не было в итоговом файле) ещё не подскажешь?

anonymous ()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.