다음 CSV 파일이 있습니다.
ID,PDBID,FirstResidue,SecondResidue,ThirdResidue,FourthResidue,Pattern
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_3,4tov,1043,1044,1047,1048,CC/GA Naked ribose-zipper
RZ_AUTO_4,4tov,1556,1557,1514,1515,CC/GA Naked ribose-zipper
RZ_AUTO_5,4tow,130,131,99,100,AU/CA Canonical ribose-zipper
RZ_AUTO_6,4tow,766,767,1524,1525,AA/CG Canonical ribose-zipper
RZ_AUTO_7,4tow,131,132,98,99,UC/AC Canonical ribose-zipper
각 행을 반복하면서 FirstResidue 및 SecondResidue 값을 확장할 수 있는 행을 인쇄해야 합니다(즉, SecondResidue는 동일한 PDBID를 사용하는 다른 행에서 FirstResidue가 됩니다). 예를 들어 (RZ_AUTO_1 행 및 RZ_AUTO_2 행) AND (RZ_AUTO_5 행 및 RZ_AUTO_7 행)입니다. 출력은 다음과 같아야 합니다.
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
awk나 다른 UNIX 방법을 사용하여 이를 수행할 수 있습니까? 저는 OSX를 사용하고 있습니다.
답변1
다음을 시도해 볼 수 있습니다.
$ 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
설명하다
sort
파일은 두 번째 및 세 번째 필드를 기준으로 정렬되어 동일한 PDBID를 가진 행이 함께 정렬되고 함수의 첫 번째 나머지 위치를 기준으로 정렬됩니다 .-r
정렬을 반대로 하려면(더 큰 숫자가 먼저 인쇄되도록)-t,
필드 구분 기호를 로 설정하고,
정렬-k
할 필드를 정의합니다.
awk
스크립트 는 다음과 같습니다 .
-F,
: 필드 구분 기호를 로 설정합니다,
.a[$2][$3]=$0;
: 리스트의 리스트, 2차원 배열입니다. 예를 들어 첫 번째 행의 경우 배열 이름만 됩니다a[4tov][1404]=$0
.a
값은 현재 행으로 설정됩니다$0
.if(a[$2][$4])
: 네 번째 필드(두 번째 잔여물)가 첫 번째 잔여물과 동일한 PDBID를 갖는 것으로 확인된 경우.print a[$2][$4]; print;
: 현재 행(배열의 값으로 저장되므로a
)과 현재 행을 인쇄합니다.
확인하기 위해 OSX에 액세스할 수는 없지만귀하의 의견awk
, Python과 달리 OSX는 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]}'
답변2
당신은 그것을 사용할 수 있습니다텍스트 쿼리SQL 데이터베이스와 같은 스프레드시트 데이터를 쿼리합니다.
답변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