Применение простых сопоставлений строк в файлах JSON

Поместите гены, которые вы хотите сопоставить, в файл, по одному на строку. Тогда это просто вызов 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
2
17.06.2021, 19:22
1 ответ

Следующая 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
2
28.07.2021, 11:25

Теги

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