Сравните столбец 2 файла 1 со столбцами 4 и 5 файла 2

У меня есть файл_1 с разделителями табуляции.

NC_025       4569   .   KX838946.2      
NC_025       16546  .   KJ641660.1      
NC_025       11996  .   KX932454.2

файл_2

NC_025.1     RefSeq  gene    5690    7513    .       +       .       ID=gene-NZ82_gp4;Dbxref=GeneID:20964334;Name=NZ82_gp4;gbkey=Gene;gene_biotype=protein_coding;locus_tag=NZ82_gp4
NC_025.1     RefSeq  gene    4612    10046   .       +       .       ID=gene-NZ82_gp5;Dbxref=GeneID:20964335;Name=NZ82_gp5;gbkey=Gene;gene_biotype=protein_coding;locus_tag=NZ82_gp5
NC_025.1     RefSeq  gene    10337   16933   .       +       .       ID=gene-NZ82_gp6;Dbxref=GeneID:20964336;Name=NZ82_gp6;gbkey=Gene;gene_biotype=protein_coding;locus_tag=NZ82_gp6
NC_025.1     RefSeq  gene    9000    12000    .      +       .       ID=gene-AL82_gp5;Dbxref=GeneID:109647334;Name=AL82_gp5;gbkey=Gene;gene_biotype=protein_coding;locus_tag=AL82_gp5

Я хочу сравнить столбец 2 файла 1 со столбцами 4 и 5 файла 2. Если столбец 2 файла_1 равен >= столбца 4 и <= столбца 5 той же строки файла 2, я хочу объединить всю строку файла_1 и файла_2.

NC_025       16546   .   KJ641660.1     NC_025.1     RefSeq  gene    10337   16933   .       +       .       ID=gene-NZ82_gp6;Dbxref=GeneID:20964336;Name=NZ82_gp6;gbkey=Gene;gene_biotype=protein_coding;locus_tag=1NZ82_gp6    
NC_025       11996   .   KX932454.2     NC_025.1     RefSeq  gene    10337   16933   .       +       .       ID=gene-NZ82_gp6;Dbxref=GeneID:20964336;Name=NZ82_gp6;gbkey=Gene;gene_biotype=protein_coding;locus_tag=1NZ82_gp6
NC_025       11996   .   KX932454.2     NC_025.1     RefSeq  gene    9000    12000    .       +       .       ID=gene-AL82_gp5;Dbxref=GeneID:109647334;Name=AL82_gp5;gbkey=Gene;gene_biotype=protein_coding;locus_tag=AL82_gp5

Я пробовал:

awk '{
  if (NR==FNR) {
  l[NR]=$0
  a[NR]=$2
 }
  else if (a[FNR]>=$4 && a[FNR]<=$5) {
  print l[FNR],$0
 }
}' file_1 file_2 > File_3

Но ничего не печатает.

хотя ваш код можно сократить, он выдает результаты на основе ваших образцов данных. Возможно, вы захотите установить OFS = "\t" или использовать l[FNR] "\t" $0

jhnc 09.08.2024 13:32

Никогда не называйте переменную l, она слишком похожа на число 1 и запутывает ваш код.

Ed Morton 09.08.2024 13:40

измененный образец по-прежнему выдает для меня результат. какой результат запуска date >File_3; cat File_3 в том же каталоге?

jhnc 09.08.2024 13:55

вам, вероятно, также следует установить -F'\t', чтобы избежать проблем с пробелами, изменяющими количество столбцов

jhnc 09.08.2024 13:59

Должно ли первое поле вывода ДЕЙСТВИТЕЛЬНО быть значением из второго файла (NC_025.1), а не значением из первого файла (NC_025)? Если нет, исправьте это, поскольку это влияет на каждое потенциальное решение.

Ed Morton 09.08.2024 14:34

Прямо сейчас похоже, что вы хотите сравнить два файла построчно (т. е. сравнить строку 3 файла 1 со строкой 3 файла 2), отсюда и ответ paste, который у вас есть, но который, как вы говорите, не работает для ты. Если это не так и вы хотите сравнить все столбцы 2 из файла 1 со всеми столбцами 4/5 из файла 2, тогда отредактируйте свой вопрос, чтобы показать минимальный воспроизводимый пример, демонстрирующий эту функциональность.

Ed Morton 09.08.2024 14:37

текущий скрипт awk тоже генерирует для меня желаемый результат; пожалуйста, еще раз проверьте, предоставили ли вы нам копию тех же файлов данных, с которыми работаете; предполагая, что у нас одинаковые входные данные, я бы хотел поискать в файлах данных любые непечатаемые символы, и если вы не знаете, как это сделать, обновите вопрос, указав полный вывод из od -c <(tail -1 file_1); od -c <(tail -1 file_2)

markp-fuso 09.08.2024 15:00

Они очень похожи на многие другие основные вопросы биоинформатики. Если вы скажете нам, какие здесь типы файлов называются (BAM? Chloropleth? Fastn и т. д.), мы, вероятно, сможем найти существующие дубликаты.

tripleee 09.08.2024 16:34
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
8
71
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Итак, вы по сути хотите объединить все строки, используя критерии диапазона. После сохранения первого файла вам необходимо перебрать его строки для каждой строки во втором файле.

awk '
  NR==FNR {a[NR]=$0; p[NR]=$2; next}
          {for (n in a) if ($4<=p[n] && p[n]<=$5) print a[n] "\t" $0}
' file_1.txt file_2.txt > file_3.txt

@RaviSaroch этот код также выдает запрошенный вами вывод с примерами данных, неясно, что вы подразумеваете под «он ищет весь столбец»: $ обращается к полям текущей строки

jhnc 09.08.2024 14:09

@jhnc Я ДУМАЮ, что они имеют в виду, что хотят сравнить значения столбца файла 1 с применимыми столбцами во всем файле 2, а не только со столбцами в том же номере строки в файле 2, но это еще не ясно из вопроса . Я думаю, когда в вопросе говорят «из той же строки файла 2», они имеют в виду, что столбец 4 и столбец 5 из файла 2 сравниваются со столбцом 2 из файла 1, находятся в одной строке друг с другом, а не то, что они находитесь в той же строке, что и столбец 2 из файла 1. Но я не знаю....

Ed Morton 09.08.2024 14:38

@EdMorton это возможно, но с предоставленным примером ввода ваша интерпретация, похоже, потребует двух строк образца вывода (строки 2 и 3 первого файла соответствуют строке 3 второго файла)

jhnc 09.08.2024 17:22

@jhnc хорошая мысль. тогда я не знаю, думаю, посмотрим, что нам скажет ОП.

Ed Morton 09.08.2024 17:46

Если значение в столбце 2 файла 1 больше значения в столбце 4 в строке 30 файла_2, оно должно быть меньше значения в столбце 5 в той же строке (30).

Ravi Saroch 09.08.2024 18:45

«столбец 2 файла 1» — мы это знаем, но мы обсуждаем, какие строки в файле 1? Столбец 2 ТОЛЬКО строки 30 в файле 1 или столбец 2 ЛЮБОЙ строки в файле 1 или что-то еще?

Ed Morton 09.08.2024 20:39

столбец 2 любой строки в файле 1

Ravi Saroch 10.08.2024 05:34

Значение в строке 3 (11996) файла 1 больше значения в столбце 4 (10337) и меньше значения в столбце 5 (16933). Аналогично критерии выполняются и в строке 4 файла 2, в которой значение файла 1 (11996) больше значения в строке 4 (9000) и меньше, чем в столбце 5 (12000).

Ravi Saroch 10.08.2024 06:19

@Ravi Хорошо, но почему первая строка file_1 отсутствует в выводе, поскольку ее значение 4569 явно находится между значениями 3016 и 10046 из второй строки file_2?

pmf 10.08.2024 06:55

@pmf Я обновил файл 2; теперь он не соответствует критериям и не включается в выходной файл.

Ravi Saroch 10.08.2024 07:04

Другие вопросы по теме