파일 B의 필드 이름을 포함하는 파일 A의 전체 열을 삭제합니다.

파일 B의 필드 이름을 포함하는 파일 A의 전체 열을 삭제합니다.

500개의 열이 있는 파일이 있습니다. 다른 파일의 목록에 이름이 설명되어 있는 일부 열을 삭제해야 합니다. 예를 들어

fileA:

    id1 id22 id43 id4 id5 id6 id7 id68 id9 id10 id11 
    TT AA AG TC TT AA AG TC DD AA CC     
    TT AC GG TC TT AG AG TC AD AA DC 

fileB:

    id1
    id5
    id10
    id68

원하는 출력:

         id22 id43 id4 id6 id7 id9 id11 
           AA AG TC AA AG DD CC     
           AC GG TC AG AG AD DC  

답변1

이것을 한 줄짜리라고 부르고 싶은지 모르겠지만 매우 기본적인 도구를 사용하여 즉시 수행할 수 있습니다.

cut -d' ' -f $(head -n 1 fileA | tr -s ' ' '\n' | cat -n | grep -wvf fileB | cut -f 1 | tr '\n ' ',' | sed -e 's/,$//' -e 's/^,//') fileA

설명하다:

cut명령은 cut -d' ' -f [...] fileA단순히 공백을 구분 기호로 사용 -d' '하고 유지할 필드를 선택합니다 -f. 그런 다음 동적으로 생성한 쉼표로 구분된 색인 목록에 따라 어떤 필드/열을 사용할 것인지에 대한 질문이 있습니다.

head -n 1 fileA머리글 행만 선택하고 tr -s ' ' '\n'모든 공백을 줄 바꿈으로 변경하고( -s여러 개의 공백을 단일 공백으로 압축하고) cat -n이 목록에 줄 번호를 추가합니다.

이 행 번호는 원래 열 번호와 동일하므로 나머지 행 번호를 선택해야 합니다. 삭제 목록의 헤더에 대해 역핑을 수행한 다음 grep -wvf fileB(예: 동시에 삭제되지 않도록 하기 위해 사용됨) 이 목록이 행 번호만을 가리키도록 하고 개행 문자를 쉼표( )로 변환하여 쉼표로 구분된 목록을 제공합니다. 남은 열 수입니다. 하지만 마지막 단계에서는 목록 앞뒤에 여전히 쉼표가 있으므로 를 사용하여 제거해야 합니다. 이제 외부 필드 목록이 완성되었습니다.grep-wid1id11cut -f 1tr '\n' ','sed -e 's/,$//' -e 's/^,//'cut

먼저 카운터 확인으로 내부 파이프라인을 별도로 실행할 수도 있습니다. 추가 열 인덱스는 결과에 영향을 미치지 않습니다.

관련 정보