입력 파일은 다음과 같습니다.
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개 미만의 매개변수를 사용하여 실행하면 매개변수가 무엇인지 알려주고 종료됩니다. 그렇지 않으면 처음 세 개의 인수를 쉘 변수에 저장한 다음 인수 목록 밖으로 이동합니다. 그런 다음 을 호출하여 awk
쉘 awk
변수 값을 변수로 전달합니다.
다음 방법 중 하나로 호출할 수 있습니다.
./myscript chr4 3 7 data
또는
./myscript chr4 3 7 < data
또는
(다른 프로세스)|./myscript chr4 3 7그리고 어쨌든 출력을
>
.
답변3
grep을 사용하여 이 작업을 수행할 수 있습니다.
grep -e '^chr4\s\+[3-7]' input
표현식은 다음과 같습니다. ^chr4
chr4(하나 이상의 공백 문자)로 시작하는 줄은 3~7 범위의 단일 숫자와 일치합니다.\s\+
[3-7]
아마도 더 유용한 것은 일치하는 대신 가능한 한 많은 행을 사용하거나 head
제공 하는 것입니다 (첫 번째 열과 일치하려면 grep만 사용하십시오).tail
grep
grep -e '^chr4\s\+' input| tail -n +3| head -n 5
grep
로 시작하는 라인과 일치하여 chr4
라인 tail
3에서 시작하는 라인을 제공하고 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
원하는 출력이 포함됩니다. 각 크로몬을 자체 파일에 넣도록 수정할 수도 있습니다.