У меня есть файл_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
Но ничего не печатает.
Никогда не называйте переменную l
, она слишком похожа на число 1
и запутывает ваш код.
измененный образец по-прежнему выдает для меня результат. какой результат запуска date >File_3; cat File_3
в том же каталоге?
вам, вероятно, также следует установить -F'\t'
, чтобы избежать проблем с пробелами, изменяющими количество столбцов
Должно ли первое поле вывода ДЕЙСТВИТЕЛЬНО быть значением из второго файла (NC_025.1
), а не значением из первого файла (NC_025
)? Если нет, исправьте это, поскольку это влияет на каждое потенциальное решение.
Прямо сейчас похоже, что вы хотите сравнить два файла построчно (т. е. сравнить строку 3 файла 1 со строкой 3 файла 2), отсюда и ответ paste
, который у вас есть, но который, как вы говорите, не работает для ты. Если это не так и вы хотите сравнить все столбцы 2 из файла 1 со всеми столбцами 4/5 из файла 2, тогда отредактируйте свой вопрос, чтобы показать минимальный воспроизводимый пример, демонстрирующий эту функциональность.
текущий скрипт awk
тоже генерирует для меня желаемый результат; пожалуйста, еще раз проверьте, предоставили ли вы нам копию тех же файлов данных, с которыми работаете; предполагая, что у нас одинаковые входные данные, я бы хотел поискать в файлах данных любые непечатаемые символы, и если вы не знаете, как это сделать, обновите вопрос, указав полный вывод из od -c <(tail -1 file_1); od -c <(tail -1 file_2)
Они очень похожи на многие другие основные вопросы биоинформатики. Если вы скажете нам, какие здесь типы файлов называются (BAM? Chloropleth? Fastn и т. д.), мы, вероятно, сможем найти существующие дубликаты.
Итак, вы по сути хотите объединить все строки, используя критерии диапазона. После сохранения первого файла вам необходимо перебрать его строки для каждой строки во втором файле.
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 Я ДУМАЮ, что они имеют в виду, что хотят сравнить значения столбца файла 1 с применимыми столбцами во всем файле 2, а не только со столбцами в том же номере строки в файле 2, но это еще не ясно из вопроса . Я думаю, когда в вопросе говорят «из той же строки файла 2», они имеют в виду, что столбец 4 и столбец 5 из файла 2 сравниваются со столбцом 2 из файла 1, находятся в одной строке друг с другом, а не то, что они находитесь в той же строке, что и столбец 2 из файла 1. Но я не знаю....
@EdMorton это возможно, но с предоставленным примером ввода ваша интерпретация, похоже, потребует двух строк образца вывода (строки 2 и 3 первого файла соответствуют строке 3 второго файла)
@jhnc хорошая мысль. тогда я не знаю, думаю, посмотрим, что нам скажет ОП.
Если значение в столбце 2 файла 1 больше значения в столбце 4 в строке 30 файла_2, оно должно быть меньше значения в столбце 5 в той же строке (30).
«столбец 2 файла 1» — мы это знаем, но мы обсуждаем, какие строки в файле 1? Столбец 2 ТОЛЬКО строки 30 в файле 1 или столбец 2 ЛЮБОЙ строки в файле 1 или что-то еще?
столбец 2 любой строки в файле 1
Значение в строке 3 (11996) файла 1 больше значения в столбце 4 (10337) и меньше значения в столбце 5 (16933). Аналогично критерии выполняются и в строке 4 файла 2, в которой значение файла 1 (11996) больше значения в строке 4 (9000) и меньше, чем в столбце 5 (12000).
@Ravi Хорошо, но почему первая строка file_1
отсутствует в выводе, поскольку ее значение 4569
явно находится между значениями 3016
и 10046
из второй строки file_2
?
@pmf Я обновил файл 2; теперь он не соответствует критериям и не включается в выходной файл.
хотя ваш код можно сократить, он выдает результаты на основе ваших образцов данных. Возможно, вы захотите установить
OFS = "\t"
или использоватьl[FNR] "\t" $0