특정 열이 특정 패턴과 일치하는 단순화된 CSV에서 행을 제거합니다.

특정 열이 특정 패턴과 일치하는 단순화된 CSV에서 행을 제거합니다.

다음과 같은 단순화된 CSV 파일이 있습니다(필드에 구분 기호나 줄바꿈이 포함되어 있지 않음).

ID,PDBID,FirstResidue,FirstChain,SecondResidue,SecondChain,ThirdResidue,ThirdChain,FourthResidue,FourthChain,Pattern
RZ_AUTO_505,1hmh,A22L,C,A22L,A,G21L,A,A23L,A,AA/GA Naked ribose
RZ_AUTO_506,1hmh,A22L,C,A22L,A,G114,A,A23L,A,AA/GA Naked ribose
RZ_AUTO_507,1hmh,A130,E,A90,A,G80,A,A130,A,AA/GA Naked ribose
RZ_AUTO_508,1hmh,A140,E,A90,E,G120,A,A90,A,AA/GA Naked ribose
RZ_AUTO_509,1hmh,G102,A,C103,A,G102,E,A90,E,GC/GA Single ribose
RZ_AUTO_510,1hmh,G102,A,C103,A,G120,E,A90,E,GC/GA Single ribose
RZ_AUTO_511,1hmh,G113,C,C112,C,G21L,A,A23L,A,GC/GA Single ribose
RZ_AUTO_512,1hmh,G113,C,C112,C,G114,A,A23L,A,GC/GA Single ribose
RZ_AUTO_513,1hnw,C1496,A,G1497,A,A1518,A,A1519,A,CG/AA Canonical ribose
RZ_AUTO_514,1hnw,C1496,A,G1497,A,A1519,A,A1518,A,CG/AA Canonical ribose
RZ_AUTO_515,1hnw,C221,A,U222,A,A195,A,A196,A,CU/AA Canonical ribose
RZ_AUTO_516,1hnw,C221,A,U222,A,A196,A,A195,A,CU/AA Canonical ribose

FirstResidue, SecondResidue, ThirdResidue 또는 FourthResidue의 값이 정수로 끝나지 않으면 CSV 행을 삭제해야 합니다. 출력은 아래와 같아야 합니다.

RZ_AUTO_507,1hmh,A130,E,A90,A,G80,A,A130,A,AA/GA Naked ribose
RZ_AUTO_508,1hmh,A140,E,A90,E,G120,A,A90,A,AA/GA Naked ribose
RZ_AUTO_509,1hmh,G102,A,C103,A,G102,E,A90,E,GC/GA Single ribose
RZ_AUTO_510,1hmh,G102,A,C103,A,G120,E,A90,E,GC/GA Single ribose
RZ_AUTO_513,1hnw,C1496,A,G1497,A,A1518,A,A1519,A,CG/AA Canonical ribose
RZ_AUTO_514,1hnw,C1496,A,G1497,A,A1519,A,A1518,A,CG/AA Canonical ribose
RZ_AUTO_515,1hnw,C221,A,U222,A,A195,A,A196,A,CU/AA Canonical ribose
RZ_AUTO_516,1hnw,C221,A,U222,A,A196,A,A195,A,CU/AA Canonical ribose

그래서 어떻게 사용하는지 궁금합니다 awk. 저는 Mac OSX를 사용하고 있습니다.

답변1

세 번째, 다섯 번째, 일곱 번째, 아홉 번째 필드가 숫자로 끝나는 줄만 인쇄하려고 합니다. 이 경우:

$ awk -F, '$3 ~/[[:digit:]]$/ && $5 ~/[[:digit:]]$/ && $7 ~/[[:digit:]]$/ && $9 ~ /[[:digit:]]$/' file
RZ_AUTO_507,1hmh,A130,E,A90,A,G80,A,A130,A,AA/GA Naked ribose
RZ_AUTO_508,1hmh,A140,E,A90,E,G120,A,A90,A,AA/GA Naked ribose
RZ_AUTO_509,1hmh,G102,A,C103,A,G102,E,A90,E,GC/GA Single ribose
RZ_AUTO_510,1hmh,G102,A,C103,A,G120,E,A90,E,GC/GA Single ribose
RZ_AUTO_513,1hnw,C1496,A,G1497,A,A1518,A,A1519,A,CG/AA Canonical ribose
RZ_AUTO_514,1hnw,C1496,A,G1497,A,A1519,A,A1518,A,CG/AA Canonical ribose
RZ_AUTO_515,1hnw,C221,A,U222,A,A195,A,A196,A,CU/AA Canonical ribose
RZ_AUTO_516,1hnw,C221,A,U222,A,A196,A,A195,A,CU/AA Canonical ribose

어떻게 작동하나요?

일반적인 awk명령은 조건과 작업으로 구성됩니다. 여기에는 네 부분으로 구성된 조건문이 있습니다. 우리가 원하는 액션은 기본 액션(인쇄 줄)이기 때문에 실제로 지정할 필요는 없습니다. 조건의 각 부분은 다음과 같습니다.

$3 ~/[[:digit:]]$/

필드 3이 숫자로 끝나는 경우입니다. 이는 필드 5, 7, 9에 각각 하나씩, 세 개의 다른 필드에 대한 AND 연산입니다. 모두 사실이라면 행을 인쇄하십시오.

답변2

다음 Python2 솔루션을 시도해 볼 수도 있습니다.

#!/usr/bin/env python2
import csv, re
with open('file.txt', 'rb') as f:
    for line in csv.reader(f):
        if re.search(r'[0-9]$', line[2]) and re.search(r'[0-9]$', line[4]) and re.search(r'[0-9]$', line[6]) and re.search(r'[0-9]$', line[8]):
            print ' '.join(line)

답변3

Miller( mlr)를 사용하고 정규식을 사용하여 명명된 필드 4개를 테스트합니다.

$ mlr --csvlite filter '$FirstResidue =~ "[0-9]$" && $SecondResidue =~ "[0-9]$" && $ThirdResidue =~ "[0-9]$" && $FourthResidue =~ "[0-9]$"' file
ID,PDBID,FirstResidue,FirstChain,SecondResidue,SecondChain,ThirdResidue,ThirdChain,FourthResidue,FourthChain,Pattern
RZ_AUTO_507,1hmh,A130,E,A90,A,G80,A,A130,A,AA/GA Naked ribose
RZ_AUTO_508,1hmh,A140,E,A90,E,G120,A,A90,A,AA/GA Naked ribose
RZ_AUTO_509,1hmh,G102,A,C103,A,G102,E,A90,E,GC/GA Single ribose
RZ_AUTO_510,1hmh,G102,A,C103,A,G120,E,A90,E,GC/GA Single ribose
RZ_AUTO_513,1hnw,C1496,A,G1497,A,A1518,A,A1519,A,CG/AA Canonical ribose
RZ_AUTO_514,1hnw,C1496,A,G1497,A,A1519,A,A1518,A,CG/AA Canonical ribose
RZ_AUTO_515,1hnw,C221,A,U222,A,A195,A,A196,A,CU/AA Canonical ribose
RZ_AUTO_516,1hnw,C221,A,U222,A,A196,A,A195,A,CU/AA Canonical ribose

관련 정보