두 열로 정의된 두 값 사이의 값 계산

두 열로 정의된 두 값 사이의 값 계산

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

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}'

첫 번째 awk로 1단계를 수행합니다 . 두 번째나 세 번째 열보다 첫 번째 열에 줄이 더 많기 때문에 테스트(또는 그럴 수도 있음 ) 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 ...)에서 실현되는 것입니다.

관련 정보