파일 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

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

관련 정보