Вам необходимо выполнить задачу ps
, чтобы отобразить информацию о потоке; в противном случае он только перечисляет процессы:
ps -eL -o pid,tid,comm | awk '$1 != $2'
покажет все потоки, кроме основного потока каждого процесса, т. е. записи в таблице процессов, где pid и tid разные. Значимой опцией является-L
:без этого, ps
будет перечислять только записи, где pid и tid идентичны.
Во FreeBSD эквивалентной опцией является -H
. Я не проверял другие BSD или System V.
Поскольку awk
не имеет возможности выполнять построчные операции -за -над двумя файлами, потребуется определенная буферизация. Это может работать, если ваши файлы достаточно малы.
awk 'NR==FNR{v[$1]=$2; next}
{if ($2*v[$1]>=0) {print $1 > "matched"} else {print $1 > "unmatched"}}' file1.txt file2.txt
file1.txt
будут записаны только пары "метка" -"значение" -в массив v
и пропущено выполнение до следующей строки ввода. Различие между тем, обрабатываем ли мы file1.txt
или file2.txt
, делается путем проверки того, равен ли счетчик FNR
строки файла -глобальному счетчику строк NR
. Если они равны, мы обрабатываем первый файл. file2.txt
проверяется, является ли произведение «значения» части текущей строки и соответствующего значения из file1.txt
нулевым или положительным. Если да, то их знаки равны, и часть «метка» выводится в файл matched
. Если оно отрицательное, знаки неравны, и часть «метка» выводится в файл unmatched
. Результаты:
~ > cat matched
rs151222586
~ > cat unmatched
6:66893424_T_C
rs12364336
rs57502521
Примечание
+0
и -0
считаются имеющими одинаковый знак. вставьте + awk файлы со стороны -на -, чтобы мы могли сравнить второе поле с четвертым:
paste file1 file2 |
awk '
$2&&$4 {
print $1 > ($2*$4>0?"match":"unmatch")
}
'
Результаты находятся в файлах совпадений и несовпадений.
Работа с несколькими входными файлами — рутинная работа, проще, если данные свернуты в один файл. Например. paste
или join
могут это сделать:
$ paste file1 file2
6:66893424_T_C -0.5985 6:66893424_T_C 0.5985
rs151222586 -0.0351 rs151222586 -0.0351
rs12364336 -0.0030 rs12364336 0.003
rs57502521 0.0099 rs57502521 -0.0099
$ join -j1 file1 file2
6:66893424_T_C -0.5985 0.5985
rs151222586 -0.0351 -0.0351
rs12364336 -0.0030 0.003
rs57502521 0.0099 -0.0099
Первый рассчитывает на правильный порядок. В обоих случаях вам, вероятно, следует проверить случаи, когда файлы не соответствуют друг другу.
Используя вывод из paste
, записи, в которых различаются знаки:
$ paste file1 file2 | awk '($2 >= 0) != ($4 >= 0) {print $1}'
6:66893424_T_C
rs12364336
rs57502521
>=
оценивается как 1
или 0
, поэтому использование !=
для сравнения результатов сравнения работает таким образом. Я произвольно решил выровнять нули как положительные. Аналогичным образом используйте ==
для знаков равенства.
Мы могли бы также явно определить функцию знака:
$ paste file1 file2 | awk 'function sign(x) { return x >= 0 ? +1 : -1; }
sign($2) != sign($4) {print $1}'
6:66893424_T_C
rs12364336
rs57502521