Как узнать, содержит ли столбец строку?

/proc/$$/environи переменная environнезависимы. environдействительно отражает изменения в среде, и на самом деле значение указателя в environтакже изменяется, когда переменные среды добавляются в среду через putenv()(, но это детали реализации.)

Нам придется различать уровень системного вызова и уровень библиотеки. На уровне системного вызова единственным механизмом, связанным со средой, является аргумент envpдля вызова execve. Ожидается, что этот параметр будет содержать пары name=value, составляющие среду новой программы. Эта среда копируется в стек нового процесса, откуда ее может подобрать стартовый код пользовательского пространства.

На уровне библиотеки у нас есть

  • глобальная переменная environ, указывающая на копию окружения
  • функции getenv()и putenv()для изучения и изменения окружения
  • семейство exec*функций (, не включая execve), которые либо неявно (через environ), либо явно (передаются через параметр )получают доступ к среде

Библиотечные функции exec*в конечном итоге вызывают системный вызов execve. Переменная environне указывает на среду в стеке; вместо этого среда копируется в кучу процесса перед установкой переменной environ(это опять-таки деталь реализации.)

Почему /proc/$$/environне отражает изменений в окружающей среде?/proc/$$/environ— это виртуальный файл, предоставляемый ядром, и ядро ​​не имеет возможности узнать, что происходит на этом низком уровне адресного пространства пользовательского процесса. Ядро ничего не знает о переменной environи не знает о структурах данных, используемых процессом для хранения среды.

1
24.02.2020, 09:02
2 ответа

Эта команда awk проверит, является ли значение последнего столбца > 1 или оно содержит какие-либо другие символы (, кроме цифр и точек)

$ awk 'NR>1 && ($NF>1 || $NF~/[^0-9.]/)' test.txt
rs534 0.22 A G 0.245B
rs947 -0.07 T G 1.00002
rs667 0.37 C T 0.0A4

$ cat test.txt
SNP Beta A1 A2 P
rs124 -0.5 T C 0.11
rs534 0.22 A G 0.245B
rs199 1.32 G C 0.345
rs947 -0.07 T G 1.00002
rs667 0.37 C T 0.0A4
rs667 0.37 C T 0.04
1
28.04.2021, 23:22

Предупреждающее сообщение, по-видимому, указывает на «закрытое множество» (открытое с «левой» стороны, закрытое с «правой» )НЕ включая 0. Попробуйте это дополнение прекрасного предложения Камараджа:

awk 'NR>1 && ($NF>1 || $NF~/[^0-9.]/ || $NF == 0)' file
0
28.04.2021, 23:22

Теги

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