awk удаляет число после запятой

Итак, две вещи.

  1. На самом деле это не вопрос UNIX и Linux, за исключением того факта, что вы используете Pi -Z -W с установленным на нем *Nix (Я полагаю, исходя из использования изhostapd).
  2. Вы делаете это немного сложнее, чем это необходимо. Состояние двери — логическое :открытое или закрытое. правда или ложь. 0 или 1. да или нет.

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

SSID = TheDoorIsOpen!

Когда Pi обнаруживает, что дверь открыта, он запускает службу hostapd, и сигнал виден/доступен/просматривается компьютерами поблизости. Когда дверь закрыта, Pi останавливает службу, сигнал 802.11 исчезает, а SSID не отображается как активная/доступная сеть.

1
03.01.2020, 21:12
2 ответа

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

$ awk 'BEGIN { OFS=FS="\t" } { sub("\\..*", "", $1); print }' file
ENST00000456328 1657    1350.015        0       0

Это применяет замену к первой вкладке -поле с разделителями (только ), которая удаляет все после первой точки.

Аналогично сsed:

$ sed 's/\.[^[:blank:]]*//' file
ENST00000456328 1657    1350.015        0       0

При этом удаляются все не -пустые символы после первой точки в каждой строке. Вы также можете использовать \.[[:digit:]]*в качестве шаблона, который будет явно соответствовать цифрам, а не пробелам, отличным от -.

Если в ваших данных есть не -версионные идентификаторы Ensembl или идентификаторы из другой базы данных,тогда вы можете убедиться, что вы соответствуете идентификатору версии Ensembl ID, прежде чем изменять строку. С помощью awkэто можно сделать с помощью

.
$ awk 'BEGIN { OFS=FS="\t" } /^ENS[^[:blank:]]*\./ { sub("\\..*", "", $1) } { print }' file
ENST00000456328 1657    1350.015        0       0

printтеперь находится в отдельном блоке от блока, который выполняет модификацию первого поля. Это делается для того, чтобы печатались все строки, измененные или нет. Весь блок { print }может быть заменен более коротким 1, если у вас мало времени или места для ввода.

И сsed:

$ sed '/^ENS[^[:blank:]]*\./s/\.[^[:blank:]]*//' file
ENST00000456328 1657    1350.015        0       0

Код sedуже печатает все строки, независимо от того, изменены они или нет, поэтому никаких других модификаций не требуется (, тогда как в коде awkвывод результата должен был быть немного оправдан по сравнению с первая awkвариация ).

В последних двух вариантах мы сопоставляем версионный идентификатор ансамбля в начале строки с регулярным выражением ^ENS[^[:blank:]]*\., прежде чем пытаться внести какие-либо изменения.

Ни один из приведенных выше вариантов не заботится и не должен заботиться об остальных данных в строке. Каждая строка может содержать дополнительные поля, и они будут переданы без изменений.


Использование точки в качестве разделителя полей вдохновлено, но приведет к проблемам, так как больше данных в строке содержит точки.

5
28.04.2021, 23:26

Если вы хотите удалить все десятичные знаки вне зависимости от поля и иметь возможность обрабатывать потенциальные десятичные знаки в разных полях, вы можете использовать функцию gsub:

awk '{gsub(/\.[0-9]+ /, " ")}1'

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

1
28.04.2021, 23:26

Теги

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