열 값을 기준으로 파일을 행으로 분할

열 값을 기준으로 파일을 행으로 분할

입력 파일은 다음과 같습니다.

chr1    1    G    300
chr1    2    A    500
chr1    3    C    200
chr4    1    T    35
chr4    2    G    400
chr4    3    C    435
chr4    4    A    223
chr4    5    T    400
chr4    6    G    300
chr4    7    G    340
chr4    8    C    400

실제 파일이 너무 커서 처리할 수 없기 때문에 특정 범위 내에서 염색체(1열)와 위치(2열)로 필터링하여 더 작은 파일을 출력하고 싶습니다.

chr4예를 들어, 위치 3에서 7까지 필터링 하는 Linux 명령(sed, awk, grep 등)을 찾고 있습니다 . 원하는 최종 출력은 다음과 같습니다.

chr4    3    C    435
chr4    4    A    223
chr4    5    T    400
chr4    6    G    300
chr4    7    G    340

원본 파일을 수정하고 싶지 않습니다.

답변1

잠재적으로 정렬되지 않은 입력 파일에 대한 솔루션:

sort -k1,1 -k2,2n file | awk '$1=="chr4" && $2>2 && $2<8'

산출:

chr4    3    C    435
chr4    4    A    223
chr4    5    T    400
chr4    6    G    300
chr4    7    G    340

입력 파일이 정렬된 경우 다음을 사용하면 충분합니다.

awk '$1=="chr4" && $2>2 && $2<8' file

답변2

awk아마도 작업에 가장 적합한 도구 일 것입니다. 간단한 솔루션은 이미 제공된 솔루션과 유사하지만 실제로는 사용자가 지정한 매개변수를 사용합니다.

awk '$1=="chr4" && $2>=3 && $2<=7'

awk다음과 같이 명령을 쉘 스크립트에 넣는 것과 관련된 보다 일반적인 솔루션을 선호할 수 있습니다 .

#!/bin/sh
if [ "$#" -lt 3 ]
then
        echo "Usage:    $0 chromosome low_position high_position"
        exit 1
fi
chr="$1"
lo="$2"
hi="$3"
shift 3
awk -vchromo="$chr" -vpos1="$lo" -v pos2="$hi" '$1==chromo && $2>=pos1 && $2<=pos2' "$@"

3개 미만의 매개변수를 사용하여 실행하면 매개변수가 무엇인지 알려주고 종료됩니다. 그렇지 않으면 처음 세 개의 인수를 쉘 변수에 저장한 다음 인수 목록 밖으로 이동합니다. 그런 다음 을 호출하여 awkawk변수 값을 변수로 전달합니다.

다음 방법 중 하나로 호출할 수 있습니다.

./myscript chr4 3 7   data

또는

./myscript chr4 3 7 < data

또는

(다른 프로세스)|./myscript chr4 3 7
그리고 어쨌든 출력을 >.

답변3

grep을 사용하여 이 작업을 수행할 수 있습니다.

grep -e '^chr4\s\+[3-7]' input

표현식은 다음과 같습니다. ^chr4chr4(하나 이상의 공백 문자)로 시작하는 줄은 3~7 범위의 단일 숫자와 일치합니다.\s\+[3-7]

아마도 더 유용한 것은 일치하는 대신 가능한 한 많은 행을 사용하거나 head제공 하는 것입니다 (첫 번째 열과 일치하려면 grep만 사용하십시오).tailgrep

grep -e '^chr4\s\+' input| tail -n +3| head -n 5

grep로 시작하는 라인과 일치하여 chr4라인 tail3에서 시작하는 라인을 제공하고 head처음 5개 라인(라인 3~7)에 대한 제한 출력을 사용합니다.

답변4

이 유틸리티를 사용할 수 있습니다 split.

split -p 'chr4    (3|8)' -a 1 my_file output
  • split파일을 여러 부분으로 분할(기본적으로 의 반대 cat)
  • p확장 정규식 'chr4 (3|8)'을 기반으로 분할
  • -a 1단일 문자를 사용하여 생성된 파일에 접미사 추가
  • output생성된 각 파일의 접두사 이름입니다.

이제 파일에 outputb원하는 출력이 포함됩니다. 각 크로몬을 자체 파일에 넣도록 수정할 수도 있습니다.

관련 정보