Как отфильтровать строки в двух файлах, где значение в определенном столбце имеет один и тот же знак (-или + )?

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

ps -eL -o pid,tid,comm | awk '$1 != $2'

покажет все потоки, кроме основного потока каждого процесса, т. е. записи в таблице процессов, где pid и tid разные. Значимой опцией является-L:без этого, psбудет перечислять только записи, где pid и tid идентичны.

Во FreeBSD эквивалентной опцией является -H. Я не проверял другие BSD или System V.

4
17.03.2021, 16:55
3 ответа

Поскольку 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считаются имеющими одинаковый знак.
  • Я также предположил, что не может быть строк, в которых значение столбца 2 в одном из файлов равно 0, а в другом -не равно нулю.
1
18.03.2021, 22:24

вставьте + awk файлы со стороны -на -, чтобы мы могли сравнить второе поле с четвертым:

paste file1 file2 |
awk '
  $2&&$4 {
    print $1 > ($2*$4>0?"match":"unmatch")
  }
'

Результаты находятся в файлах совпадений и несовпадений.

6
18.03.2021, 22:24

Работа с несколькими входными файлами — рутинная работа, проще, если данные свернуты в один файл. Например. 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
4
18.03.2021, 22:24

Теги

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