Как удалить строки с числом меньше 60 в столбце 3?

Поддержка Multiarch все еще находится на очень ранних стадиях. В 11.10 было достаточно многоархива для flash и skype. В 12.04 он будет охватывать все ia32-libs, но не все остальное. Это займет годы, хотя наиболее популярные биты, вероятно, будут первыми.

6
задан 13 February 2018 в 15:26

8 ответов

Вы можете использовать awk (на самом деле это должна быть реализация GNU AWK gawk, а не mawk, которая содержит меньше функций - вам, возможно, придется установить ее sudo apt install gawk) для этого задания:

gawk '{match($3,/\((.+)\)/,m);if(m[1]>=60){print $0}}' MY_FILE

Теперь, хотя по общему признанию это выглядит как черная магия для неподготовленного глаза, логика проста:

Для каждой строки запустите материал внутри самых внешних фигурных скобок: во-первых, match($3, /\((.+)\)/, m) соответствует регулярное выражение \((.+)\) (которое соответствует открытой и закрывающей круглой скобке, сохраняя содержимое между скобками в качестве первой группы захвата) против третьего столбца $3 обработанной строки ввода и сохраняет полученный массив соответствия в переменной m. Затем проверьте условие if (m[1] >= 60), т.е. если значение первой группы захвата соответствия (независимо от того, что находится между скобками на входе) больше или равно 60. Если это так, сделайте {print $0}, который просто печатает всю обрабатываемую строку.
4
ответ дан 17 July 2018 в 21:16

Нет необходимости в расширениях Gawk:

awk -F '[()]' '$4 >= 60'

Здесь токенизатор awk, указанный через -F, представляет собой набор регулярных выражений []: поля разделяются либо открывающей, либо закрывающейся скобкой, поэтому вы см. номер вашего третьего столбца - это 4-ое awk-поле.

9
ответ дан 17 July 2018 в 21:16

Если вы не хотите изучать / использовать инструменты командной строки, вы можете также открыть файл в LibreOffice Calc и просто фильтровать данные (Calc поддерживает файлы с разделителями-разделителями).

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

Но если у вас есть большой набор данных для обработки, используя СУБД, такую ​​как MySQL будет проще, быстрее и интуитивно.

0
ответ дан 17 July 2018 в 21:16

Ниже приведен параметр perl alternate

perl -alne 'print unless $F[2] =~ /\((\d+)\)$/ && $1 < 60' и фиксирует в конце 3-го (нулевое индексирование) поле в скобках десятичных цифр, если найдено совпадение, проверьте численное значение захваченной группы и напечатайте соответственно

Пример

$ perl -alne 'print unless $F[2] =~ /\((\d+)\)$/ && $1 < 60' file 12713 Bacteria(100) Bacteroidetes(100) Bacteroidia(100)

Обратите внимание, что это реализует логику «удалите все строки в файле, число которых меньше 60 в столбце 3», как указано в вашем вопрос - который немного отличается от строк печати, число которых больше или равно 60.

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

perl -F, -lne 'print unless $F[2] =~ /\((\d+)\)$/ && $1 < 60'
4
ответ дан 17 July 2018 в 21:16

Вы можете использовать awk (на самом деле это должна быть реализация GNU AWK gawk, а не mawk, которая содержит меньше функций - вам, возможно, придется установить ее sudo apt install gawk) для этого задания:

gawk '{match($3,/\((.+)\)/,m);if(m[1]>=60){print $0}}' MY_FILE

Теперь, хотя по общему признанию это выглядит как черная магия для неподготовленного глаза, логика проста:

Для каждой строки запустите материал внутри самых внешних фигурных скобок: во-первых, match($3, /\((.+)\)/, m) соответствует регулярное выражение \((.+)\) (которое соответствует открытой и закрывающей круглой скобке, сохраняя содержимое между скобками в качестве первой группы захвата) против третьего столбца $3 обработанной строки ввода и сохраняет полученный массив соответствия в переменной m. Затем проверьте условие if (m[1] >= 60), т.е. если значение первой группы захвата соответствия (независимо от того, что находится между скобками на входе) больше или равно 60. Если это так, сделайте {print $0}, который просто печатает всю обрабатываемую строку.
4
ответ дан 23 July 2018 в 21:55
  • 1
    Это gawk конкретный, я думаю (у POSIX awk нет версии массива match AFAIK) - однако вы можете сделать аналогичную вещь с split, например. [F4] – steeldriver 9 February 2018 в 02:02
  • 2
    Я попробовал эти параметры команды. Тем не менее, я получаю пустой (0KB) выходной файл. Пожалуйста, дайте мне знать, если какая-либо ошибка в этом .... – Manoj Kumar 9 February 2018 в 02:20
  • 3
    Если он все еще не работает, я могу только представить, что ваши реальные входные данные не соответствуют данным, которые вы нам дали в качестве примера ... – Byte Commander 9 February 2018 в 02:30
  • 4
    @ManojKumar нет, вы должны взять отрывок из фактических данных, которые вы используете, затмить все, что может быть «секретным», а затем взять эту запутанную выдержку из данных и добавить это к вашему первоначальному вопросу как редактирование вопрос. Таким образом, мы можем видеть формат real данных. – Thomas Ward♦ 9 February 2018 в 02:45
  • 5
    Используйте awk -F, '{. . .}' для запятой разделенные данные – steeldriver 9 February 2018 в 03:38

Нет необходимости в расширениях Gawk:

awk -F '[()]' '$4 >= 60'

Здесь токенизатор awk, указанный через -F, представляет собой набор регулярных выражений []: поля разделяются либо открывающей, либо закрывающейся скобкой, поэтому вы см. номер вашего третьего столбца - это 4-ое awk-поле.

9
ответ дан 23 July 2018 в 21:55
  • 1
    В целом +1. Я нахожу [()] как шаблон разделителя столбцов неинтуитивным, потому что он игнорирует более очевидные столбцы с разделителями пробелов и предлагает gawk -F '[ \t()]+' '$5 >= 60'. – David Foerster 18 February 2018 в 23:19

Если вы не хотите изучать / использовать инструменты командной строки, вы можете также открыть файл в LibreOffice Calc и просто фильтровать данные (Calc поддерживает файлы с разделителями-разделителями).

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

Но если у вас есть большой набор данных для обработки, используя СУБД, такую ​​как MySQL будет проще, быстрее и интуитивно.

0
ответ дан 23 July 2018 в 21:55

Ниже приведен параметр perl alternate

perl -alne 'print unless $F[2] =~ /\((\d+)\)$/ && $1 < 60' и фиксирует в конце 3-го (нулевое индексирование) поле в скобках десятичных цифр, если найдено совпадение, проверьте численное значение захваченной группы и напечатайте соответственно

Пример

$ perl -alne 'print unless $F[2] =~ /\((\d+)\)$/ && $1 < 60' file 12713 Bacteria(100) Bacteroidetes(100) Bacteroidia(100)

Обратите внимание, что это реализует логику «удалите все строки в файле, число которых меньше 60 в столбце 3», как указано в вашем вопрос - который немного отличается от строк печати, число которых больше или равно 60.

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

perl -F, -lne 'print unless $F[2] =~ /\((\d+)\)$/ && $1 < 60'
4
ответ дан 23 July 2018 в 21:55

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

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