Быстрое извлечение поля с помощью grep

[1131969]Двоичный пакет Debian не должен содержать файлов в [1132360]/opt[1132361]. Согласно FHS, это только для локально установленных пакетов. Он будет помечен [1132362]флагом lintian[1132363]. Это заработает автоматический отказ Debian, если он пройдёт мимо вашего спонсора. Ни один пакет в официальных архивах не имеет файлов в [1132364]/opt[1132365]. Помещение исполняемых файлов пользовательского уровня на верхний уровень [1132366]/usr/bin[1132367] является правильным. Почему вы хотите, чтобы исполняемые файлы находились в поддиректории? В любом случае, создание поддиректории в [1132368]/usr/bin[1132369] для ваших исполняемых файлов не сработает, потому что поддиректория не будет находиться в пути.

Альтернативный подход заключается в использовании символической ссылки в [1132370]/usr/bin[1132371] на другое место в файловой системе, обычно [1132372]/usr/lib[1132373], [1132374]/etc/alternatives[1132375], или [1132376]/usr/share[1132377]. Однако, я думаю, что в большинстве случаев правильным будет поместить эти исполняемые файлы непосредственно в [1132378]/usr/bin[1132379].[1131972].

1
26.10.2015, 09:12
3 ответа

Вероятно, не стоит пытаться вырезать вырезать. На самом деле, попытка объединить конвейер в один процесс для обработки 32M входных строк, скорее всего, отрицательно скажется на общем времени выполнения вашей задачи. Однако это зависит от типа компьютера, на котором вы выполняете задание.

Если машина, на которой вы обрабатываете данные, имеет несколько процессорных ядер, то, вообще говоря, консолидация цикла задания в один процесс означает консолидацию всего задания на одном процессорном ядре. Это может быть желательно на системах с одним процессорным ядром, или если общее процессорное время дорого, но, по моему опыту, лучше насытить процессор и использовать все ядра одновременно, чтобы быстрее завершить задачу.

Тем не менее, вы определенно можете grep только второе поле:

grep -E $'\t(.* )?yellow( .*)?\t' <infile

... этот шаблон будет соответствовать только строкам, которые встречаются между двумя символами табуляции в строке, и будет соответствовать только тем строкам, которые ограничены с обеих сторон либо пробелом, либо одной из табуляций, разделяющих поля. В GNU grep вы также можете добавить переключатель -max match для ограничения вывода не более чем 10K совпадений. И так...

grep -m10000 -E $'\t(.* )?yellow( .*)?\t' <infile | cut -f3

... будет достаточно для выполнения всей работы.

1
27.01.2020, 23:16

Есть много способов сделать это. Самый простой, вероятно, с awk

$ awk -F$'\t' '$2 = /helicopter/ {print $3}' input.txt | head -n 10000
0/3/3032.jpg
0/3/3034.jpg
  • -F $ '\ t' устанавливает разделитель полей на TAB
  • $ 2 = / Helicopter / соответствует только в поле 2
  • print $ 3 печатает поле 3 при совпадениях

Если вы хотите, чтобы полные слова соответствовали без учета регистра, попробуйте следующее:

awk -F$'\t' 'tolower($2) ~ /\<helicopter\>/ { print $3}' input.txt | head -n 10000

\ < и \> (маркеры границ слова), вероятно работает только с gawk , что является стандартным для Linux. Также обратите внимание, что оператор сравнения изменился с = на ~ .

2
27.01.2020, 23:16

Вы также можете попробовать установить LC_ALL = C локально в своей среде.

Если LC_ALL является локалью UTF8, то это может означать, что grep необходимо выполнить декодирование UTF8 во входном потоке перед сопоставлением, и это может значительно замедлить grep

2
27.01.2020, 23:16

Теги

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