Как я могу извлекать только строки из файла, если столбец 1 встречается не реже раза?

У Doug McMahon есть пул PPA для Ubuntu Multimedia for Trusty здесь, где вы можете просмотреть доступные ему пакеты.

sudo apt-add-repository ppa:mc3man/trusty-media

и

sudo apt-get update

после этого делают [ ! d3]

sudo apt-get install ffmpeg gstreamer0.10-ffmpeg gstreamer0.10-fluendo-mp3 gstreamer0.10-gnonlin gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-bad gstreamer0.10-plugins-ugly totem-plugins-extra gstreamer-tools ubuntu-restricted-extras libxine1-ffmpeg gxine mencoder mpeg2dec vorbis-tools id3v2 mpg321 mpg123 libflac++6 totem-mozilla icedax tagtool easytag id3tool lame nautilus-script-audio-convert libmad0 libjpeg-progs flac faac faad sox ffmpeg2theora libmpeg2-4 uudeview flac libmpeg3-1 mpeg3-utils mpegdemux liba52-0.7.4-dev libquicktime2
1
задан 18 February 2017 в 22:49

1 ответ

Предполагая, что строки сортируются (сгруппированы)

Поскольку вы упоминаете, что строки сортируются по алфавиту по первому столбцу: сценарий ниже будет читать строки, сохраняет их в буфере, пока строка начинается с ту же строку в столбце первой, что и предыдущая.

в алфавитном порядке сортируется по первому столбцу , буфер добавляется в выходной файл (только), если число строк соответствует определенное значение, буфер затем очищается, и процесс запускается снова, пока файл не будет выполнен.

Это должно быть довольно быстро на больших файлах, хотя я не запускал тест времени (пока) на огромном files

Сценарий

#!/usr/bin/env python3
import sys

#-- set the minimum number below
n = 5
# don't change anything below
f = sys.argv[1]; out = sys.argv[2]; mark1 = ""; lines = []

def write_out(lines):
    if len(lines) >= n:
        with open(out, "a+") as wrt:
            for line in lines:
                wrt.write(line)

with open(f) as read:
    for l in read:
        mark2 = l.split()[0]
        if mark2 == mark1:
            lines.append(l)
        else:
            write_out(lines)
            lines = [l]
        mark1 = mark2
# add the last set of lines
write_out(lines)

Использовать

Скопировать сценарий в пустой файл, сохранить его как get_lines.py В начале скрипта, установите минимальное количество строк, начиная с строки. Запустите его с файлом ввода и вывода в качестве аргументов:
python3 /path/to/get_lines.py <input_file> <output_file>

Вывод (как ожидалось) в output_file, если мы установим предел в 5:

reverent:::ADJ  1.5     use:::V                 2.78    25
reverent:::ADJ  1.5     sacred:::ADJ            1.77    25
reverent:::ADJ  1.5     music:::N               4.31    25
reverent:::ADJ  1.5     devout:::ADJ            2.46    25
reverent:::ADJ  1.5     devotion:::N            2.36    25
2
ответ дан 23 May 2018 в 01:21
  • 1
    отлично, спасибо также за подробное описание, чтобы использовать скрипт! Это идеально! Спасибо огромное! – dani_anyman 18 February 2017 в 23:07
  • 2
    @dani_anyman спасибо за упоминание! – Jacob Vlijm 18 February 2017 в 23:09

Другие вопросы по тегам:

Похожие вопросы: