두 개의 열로 정의된 두 값 사이의 값을 계산합니다.

두 개의 열로 정의된 두 값 사이의 값을 계산합니다.

다음과 같이 세 개의 열에 데이터가 저장되어 있습니다.

3651 3631 3913
3667 3996 4276
3674 4486 4605
3707 4706 5095
3720 5174 5326
3750 5439 5899
3755 5928 6263
3767 6437 7069
3779 7157 7232
3882 7384 7450
3886 7564 7649
3900 7762 7835
4006 7942 7987
4015 8236 8325
4026 8417 8464
4065 8571 8737
4156 6790 7069
4493 7157 7450
4541 7564 7649
4551 7762 7835
4597 7942 7987
4756 8236 8325
4776 8417 8464

첫 번째 열은 특정 값이고 두 번째 열은 시작, 세 번째 열은 끝입니다. 첫 번째 열에는 825849개의 행이 있고, 두 번째 및 세 번째 열에는 58386개의 행이 있습니다. 값이 시작과 끝 사이에 있으면 첫 번째 값부터 계산을 시작해야 합니다.

내 파일에서 1열의 처음 12개 특정 값은 첫 번째 시작과 끝 사이에 있고, 다음 5개 특정 값은 두 번째 시작과 끝 사이에 있다는 것을 알고 있습니다. 전체 파일을 확인해야 해요. 나는 이것을 시도했고 작동하지만 매우 느립니다.

coords='final_exons.txt'

snp=( $( cat $coords | awk '{print $1}') )
exon_start=( $( cat $coords | awk '{print $2}') )
exon_end=( $( cat $coords | awk '{print $3}') )

i=0
counter=0
for value in ${exon_end[@]}; do
    new_val=$counter
    counter=0
    let "i++"
    for snps in ${snp[@]}; do

        if [[ $value > $snps ]]; then
            #statements
            let "counter++"
            #$counter=$(echo "scale=2; $counter-$new_val" | bc)
        else
            #$new_val=$(echo "scale=2; $counter-$")
            break
        fi
    done
    #echo "NOWENOWE $new_val "
    #echo "COUNTER $value : $counter "
    final=$(echo "scale=2; sqrt(($counter-$new_val)^2)" | bc)
    echo "Exon $i : $final SNPs"
done

어떤 팁과 요령이라도 미리 감사드립니다.

전체 데이터 링크

답변1

  1. 각 값을 한 줄에 입력하되 S또는 를 추가하여 "시작"과 "끝"을 표시합니다 E. 이제 값을 숫자로 정렬하십시오. 당신은 다음과 같은 것을 얻을 것입니다
3631S
3651
3667
...
3900
3913E
3996S
4006
...
  1. Sa 와 끝 값 E사이의 발생 횟수를 계산합니다 .

그냥 스크립트를 작성하고 행복하세요!

awk '
    {print $1} 
    $3!="" {print $2"S"; print $3"E"} 
' final_exons.txt | sort -n | awk '
    !/E|S/ {count++; next}
    /S/ {count=0; next}
    /E/ {print line++": "count}'

먼저 1단계를 awk수행하십시오 sort. 두 번째 또는 세 번째 열보다 첫 번째 열에 더 많은 행이 있기 때문에 테스트 가 있습니다 $3!=""(그리고 그럴 수도 있습니다 ).$2!=""

두 번째는 awk2단계에 해당합니다. 줄무늬 줄을 읽으면 카운터가 재설정되고 S줄 표시가 해제되면 카운터가 증가합니다. 줄무늬 줄을 읽으면 줄 번호와 함께 인쇄됩니다 E.

제공한 예제 파일에서 실행할 때의 출력은 입니다 0: 12; 1: 5; 2: 4; 3: 2; ...; 22: 0.

답변2

awk를 사용할 수 있습니다.

awk '{if( ($1 > $2) && ($1 < $3) ){print NR" "$1" "$2" "$3}}' final_exons.txt

그러나 col1 및 (col2 및 col3)이 별도로 처리되는 경우 별도의 파일로 분할하는 것이 좋습니다. 또는 데이터베이스에 데이터를 저장한 다음 그 안에서 간격 테스트를 수행합니다. 그러나 가장 효율적인 방법은 아마도 데이터를 일반 배열에 로드하고 다른 스크립팅 언어(php, python, perl...)로 테스트 루프를 구현하는 것입니다.

관련 정보