Как найти строки, которые имеют определенное значение в определенном столбце?

Этот ответ не противоречит ответу @Gilles, но является предназначен для описания другого аспекта обработки ввода, который, как мне кажется, "недостаточно освещен" в его ответе.

Вы можете использовать оба ISO_Level3_Shift (Alt-Gr) и Mode_switch одновременно с разными результатами . Требуется некоторая конфигурация, но вы можете иметь их оба и использовать их для создания 6 разных клавиш для каждой клавиши физической клавиатуры!

Вы можете, например, сконфигурируйте вкладку как Mode_switch при удерживании с и , затем, например,клавиша с пометкой «H» на клавиатуре может воспроизводить следующие символы / клавиши:

h
H
← (Курсор)
← (Символ)

с H
с Shift H
с AltGr H
с AltGr Shift H
с ] Tab H
с Tab Shift H

Итак, возвращаясь к вашему вопросу: IL3S и Mode_switch могут быть сконфигурированы так, чтобы означать разные вещи, поэтому у вас могут быть клавиши курсора и ~ 200 полезных символов из (с диакритическими знаками) языков, рисование в рамке и набор технических символов на 35 клавишах из 3-х буквенных рядов.

Для выполнения вышеуказанного:

# Initial Setup
xmodmap -e 'keycode 23 = Mode_switch ISO_Left_Tab Tab ISO_Left_Tab Tab ISO_Left_Tab'
xmodmap -e 'keycode any = Tab'
xcape -e "Mode_switch=Tab"

пример для H :

xmodmap -pke | grep 'h H'
# Make note of the keycode, note the 8 columns after the `=`,
# then edit and feed back into xmodmap with:
xmodmap -e 'keycode  43 = h H lowrightcorner uprightcorner Left leftarrow h H'

9
28.06.2019, 16:59
2 ответа

В зависимости от вашего случая использования, вы также можете использовать фактические числовые операции:

$ awk '{a = $1 % 1} a == 0 || a == 0.5' /tmp/foo
  200.000    1.353    0.086
  200.500    1.359    0.091
  201.000    1.365    0.093
  201.500    1.373    0.093
  202.000    1.383    0.091
  202.500    1.392    0.087
  203.000    1.402    0.081
  203.500    1.412    0.073
  204.000    1.423    0.065
  204.500    1.432    0.055
  205.000    1.441    0.045

Проверено с BSD awk (OSX El Capitan, 20070501) и GNU awk 4.1.4.

3
27.01.2020, 20:04

Хорошо, немного поздно добавляю свой вклад, но я думаю, что оно того стоит.

Требование, которое необходимо выполнить согласно ОП, — это первый столбец, имеющий только десятичное значение .000 или .500. Нет никаких условий относительно начального значения ни по диапазону, ни по длине. Для надежности не следует предполагать, что он ограничен чем-либо, кроме того, что перед первым столбцом нет непустых символов (или это уже не первый столбец) и что содержимое первого столбца будет иметь десятичную точку . , где-то в нем.

ОП хочет использовать grep, который будет печатать всю строку при обнаружении совпадения, поэтому единственное, что нужно сделать, это создать шаблон, который соответствует всем и только то, что требуется.

Сама простота и отсутствие причин использовать sed или awk, поскольку `grep может обрабатывать источник как файл или канал.

Для grep файла используйте grep '^[^.]*\.[05]0\{2\}\s' the_file.txt

Для grep из канала, используйте my_command | grep '^[^.]*\.[05]0\{2\}\s'

Шаблон: ^, start in the first of the line; [^.], соответствует любому недесятичному символу; *, столько раз, сколько возможно (включая ни одного); \. , соответствует десятичной точке; [05] , соответствует пятерке или нулю; 0\{2\}, сопоставьте еще 2 нуля (обратная косая черта перед открывающей и закрывающей фигурной скобкой не позволяет оболочке выполнить раскрытие скобки); \s, соответствует символу пробела (означающему конец столбца — для использования в другом варианте использования замените разделителем столбцов, обычно это команда, точка с запятой или табуляция \t).

Обратите внимание, что это будет соответствовать точно тому, что задал ОП. Он будет не соответствовать .5000 или .0000, даже если он численно эквивалентен, потому что шаблон ищет пятерку или ноль, за которыми следует ровно 2 больше нулей, за которыми следует пробел.Если это важно, то все остальные ответы до сих пор терпят неудачу, поскольку они будут соответствовать любому количеству нулей, больше 1, после контрольной цифры. И кроме ответа FloHimself, они будут соответствовать всем во втором столбце, который начинается с .000 или .500, включая . 0003 и .500T, а значение FloHimself будет соответствовать всему, что математически эквивалентно .0 и .5, независимо от того, сколько нулей Есть. Последний, хотя и не соответствует заявленному ОП, в любом случае, скорее всего, будет соответствовать тому, что нужно ОП.

Наконец, если желательна мощность и скорость awk, даже несмотря на то, что OP запросил grep, тогда команда будет следующей:

С файлом awk '$1 ~ /[^.]\.[05]0{2}$/' the_file.txt

С каналом my_command | awk '$1 ~ /[^.]\.[05]0{2}$/'

2
27.01.2020, 20:04

Теги

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