Поместите гены, которые вы хотите сопоставить, в файл, по одному на строку. Тогда это просто вызов grep:
grep -Fwf genes.txt Book3.txt
Для сохранения заголовка:
{ head -n1 Book3.txt; grep -Fwf genes.txt Book3.txt; }
параметры grep:
-F
«фиксированные строки» --отключить регулярные выражения, искать только совпадения подстрок -w
"совпадения слов" --искать только совпадения, которые являются целыми словами -f file
--указать файл с паттернами (по одному в строке)С данными образца
$ cat genes.txt
C2
CDK11A
IL3
$ { head -n1 Book3.txt; grep -Fwf genes.txt Book3.txt; }
Chr Start End Ref Alt Func.refGene Gene.refGene ExonicFunc.refGene AAChange.refGene Func.knownGene Gene.knownGene
1 53387380 53387380 G C UTR5 C2(hhh) NA NA UTR5 C2(FFF)
1 1647814 1647814 T C exonic CDK11A,CDK11B synonymous SNV NA exonic CDK11A,CDK11B
1 7069620 7069620 T C intronic PTPN6(ggg),IL3 NA NA intronic PTPN6(ggg),IL3
Следующая jq
команда:
jq -s '[
JOIN(
INDEX(.[0][];."Call Number");
.[1][];
.Dewey;
{ Title:.[1].Title, "Call Number":.[0].Congress }
)
]' catalog dewey_mappings
Это считывает два файла в массив как .[0]
и .[1]
соответственно, используя jq -s
.
Индекс вычисляется для поля Call Number
первого файла. Этот индекс используется в реляционной операции JOIN
над полем Dewey
второго файла.
Из пар элементов, которые извлекает JOIN
, объект с полем Title
, взятым из поля Title
второго файла, и полем Call Number
, взятым из поля Congress
первого файла, создано. Все созданные объекты помещаются в массив (, следовательно [
и ]
вокругJOIN
).
Результатом будет такой документ JSON:
[
{
"Title": "Design Pattern",
"Call Number": "QA76.64.D47 1995X"
},
{
"Title": "Intro to C++",
"Call Number": "QA76.73.C153 S77 2013"
}
]
См. также раздел «Операторы стиля SQL -» в руководстве jq
.
Если кажется более естественным использовать файл отображений Дьюи в качестве индекса и запрашивать его с помощью кодов Дьюи из каталога:
jq -s '[
JOIN(
INDEX(.[0][];.Dewey);
.[1][];
."Call Number";
{ Title:.[0].Title, "Call Number":.[1].Congress }
)
]' dewey_mappings catalog