Для использования:
Вы можете попробовать следующее:
$ sort -rt"," -k2,3 file.csv |
awk -F, '{a[$2][$3]=$0; if(a[$2][$4]){print a[$2][$4]; print;}}'
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
отсортирует файл на основе 2-го и 3-го полей, поэтому что строки с одинаковым PDBID сортируются вместе и в соответствии с положением 1-го остатка функции. -r
меняет порядок сортировки (так что сначала печатаются большие числа), -t,
устанавливает разделитель полей на ,
и -k
определяет поля для сортировки. Что касается сценария awk
:
-F,
: установите разделитель полей на ,
. a [$ 2] [$ 3] = $ 0;
: это список списков, двумерный массив. Например, для первой строки это будет a [4tov] [1404] = $ 0
. a
- это просто имя массива.Устанавливается значение текущей строки, $ 0
. if (a [$ 2] [$ 4])
: если четвертое поле (второй остаток) было замечено связанным с тем же PDBID, что и первый остаток. выведите [$ 2] [$ 4]; print;
: распечатать строку, в которой он был замечен (поскольку он был сохранен как значение массива a
) и текущую строку. У меня нет доступа к OSX для проверки, но, судя по вашему комментарию , похоже, что OSX awk
, в отличие от GNU awk
, не может справиться с многомерными массивами. Итак, вот то же самое в Perl:
sort -rt"," -k2,3 file.csv |
perl -F"," -ane '$k{$F[1]}{$F[2]}=$_;
print "$k{$F[1]}{$F[3]}$_" if $k{$F[1]}{$F[3]}'
через Python3 с использованием модуля RE
.
#!/usr/bin/python3
import re
import sys
j = sys.argv[1]
with open(j) as f:
fil = f.read()
m = re.findall(r'(?s)(?:^|\n)([^,]*,([^,]*),[^,]*,([^,]*)[^\n]*).*?\n([^,]*,\2,\3,[^\n]*)', fil)
for i in m:
print(i[0]+'\n'+i[-1])
Сохраните вышеуказанный код в файле с именем Script.py
и выполните этот файл, запустив команду ниже на терминале.
python3 script.py inputfile
$ python3 script.py file.csv
RZ_AUTO_1,4tov,1404,1405,1518,1519,CG/AA Canonical ribose-zipper
RZ_AUTO_2,4tov,1405,1406,1517,1518,GU/AA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper