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
-w
id1
id11
cut -f 1
tr '\n' ','
sed -e 's/,$//' -e 's/^,//'
cut
먼저 카운터 확인으로 내부 파이프라인을 별도로 실행할 수도 있습니다. 추가 열 인덱스는 결과에 영향을 미치지 않습니다.