带有grep和sed的Shell脚本,用于在比较变量的数值后从一对中提取个体

icnyk63a  于 2022-12-04  发布在  Shell
关注(0)|答案(1)|浏览(106)

我想成对比较一组单词(个体),并提取出具有最小数值变量的单词。我的文件和脚本就是这样制作的。
相关度_第三度. txt(示例):

Individual1 Individual2
Individual5 Individual23
Individual50 Individual65

filename.imiss

INDV    N_DATA  N_GENOTYPES_FILTERED    N_MISS  F_MISS
Individual1 375029  0   782 0.00208517
Individual2 375029  0   341 0.000909263
Individual3 375029  0   341 0.000909263

主脚本:

numlines=$(wc -l Relatedness_3rdDegree.txt|awk '{print $1}')

for line in `seq 1 $numlines`
do
ind1=$(sed -n "${line}p" Relatedness_3rdDegree.txt|awk '{print $1}')
ind2=$(sed -n "${line}p" Relatedness_3rdDegree.txt|awk '{print $2}')
miss1=$(grep $ind1 filename.imiss|awk '{print $5}')
miss2=$(grep $ind2 filename.imiss|awk '{print $5}')
if echo "$miss1 > $miss2" | bc -l | grep -q 1
then
echo $ind1 >> miss.txt
else
echo $ind2 >> miss.txt
fi
echo "$line / $numlines"
done

这最后一个脚本将回显一系列这样的行:
等等,直到出现以下错误:

91 / 208
(standard_in) 1: syntax error
92 / 208
(standard_in) 1: syntax error
93 / 208

如果我转到输出(miss.txt),打印的个体是不正确的。它应该打印包含在文件“Relatedness_3rdDegree.txt”中的对中的个体,这些个体具有最小的F_MISS值(“filename.imiss”的列$5)。
例如,在“Individual1 Individual2”对中,它应该比较它们的F_MISS值,并且只打印具有最小值的个体,在本例中为个体2。
我已经手动检查了值和打印的个体,看起来它打印了每对随机个体。
这个脚本有什么问题?

6jjcrrmo

6jjcrrmo1#

Bash版本:

#!/bin/bash
declare -A imiss
while read -r ind nd ngf nm fm     # we'll ignore most of these
do 
    imiss[$ind]=$fm
done < filename.imiss

while read -r i1 i2
do
    if (( $(echo "${imiss[$i1]} > ${imiss[$i2]}" | bc -l) ))
    then 
        echo "$i1"
    else
        echo "$i2"
    fi
done < Relatedness_3rdDegree.txt

运行 * 如下:

bash-imiss

AWK版本:

#!/usr/bin/awk -f
NR == FNR {imiss[$1] = $5; next}

{
    if (imiss[$1] > imiss[$2]) {
        print $1
    } else {
        print $2
    }
}

运行 * 如下:

awk-imiss filename.imiss Relatedness_3rdDegree.txt

这两个脚本使用关联数组以完全相同的方式执行完全相同的操作。

  • 这假定您已经使用chmod设置了脚本文件可执行文件,并且该文件位于PATH中,数据文件位于当前目录中。

相关问题