Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在echo输出中使用awk移动创建的bash变量_Bash_Variables_Awk - Fatal编程技术网

在echo输出中使用awk移动创建的bash变量

在echo输出中使用awk移动创建的bash变量,bash,variables,awk,Bash,Variables,Awk,我的while循环正在读取如下文件: Chr start stop value chr1 12345 4345666 -1 要与另一个文件进行比较以创建这些值的平均值(probes.txt),请执行以下操作: 现在代码是: $file | while read line do first=$(echo $line | awk '{print $1}' ) second=$(echo $line | awk '{print $2}') third=$(echo $line | awk '

我的while循环正在读取如下文件:

Chr start stop value  
chr1 12345 4345666 -1 
要与另一个文件进行比较以创建这些值的平均值(probes.txt),请执行以下操作:

现在代码是:

$file | while read line
do 
first=$(echo $line | awk '{print $1}' )
second=$(echo $line | awk '{print $2}')
third=$(echo $line | awk '{print $3}')
logsum=$(awk -v first=$first  -v second=$second -v third=$third '$1==first && $2>= second && $3<=third { sum += $4; n++} END { print sum / n; }' probes.txt
echo "$line" "$logsum"
done
但是,$logsum会在$line的最前面覆盖部分结束:

 0.232345 4345666 -1 0.232
我也尝试过printf,但也遇到了同样的问题

printf "%s %s \n" "$line" "$logsum"
我认为问题在于$logsum变量,因为如果

echo "$logsum" "$line"
相反

有人知道这里发生了什么,以及如何解决吗

编辑我正在使用Mac电脑,以防出现问题


修复了使用dos2unix时的

除了按照@kvantour的建议检查
\r\n
字符外,我建议在单个AWK脚本中执行所有这些操作。这样会更有效率

比方说,如果将其保存到
script.awk

NR == 1 { print $0,"logsum"; next }
{
    sum = 0; n = 0; avg = 0;
    while(( getline line < fn) > 0) { 
            split(line, arr);
            if (arr[1]==$1 && arr[2]>=$2 && arr[3]<=$3) {
                    sum += arr[4]; n++;
            }
    }
    if (n>0) avg = (sum / n);
    print $0, avg;
}
示例输出:

Chr start stop value logsum
chr1 12345 4345666 -1 0.2725

欢迎来到SO,不完全清楚,您能告诉我们您需要哪两个数字/字段的平均值吗?在您的示例中,平均值应该是
0.2725
?是否您的文件
$file
中有windows换行符(
\r\n
而不是
\n
)。也许
dos2unix
解决了您的问题。对于每个循环迭代,您将调用
awk
语言解释器四次。您可以使用以下方法来减少这种情况:
在读第一行、第二行、第三行时(只需将它们粘在一起作为最后的
echo
);do echo$line |(cut | awk)
是一种反模式。让
阅读
将行拆分为字段。谢谢,但我也无法让它工作。这是文件:
染色体起始停止值chr1 109446507 109537862-1 chr1 15886781 159242170-1 chr9 3464597 3494038-2 chr10 3056443 30854992-1 chr12 12637644 14893621 chr20 31955124 31980522-1 chr20 32074006 32387166 1
这是输出:这是输出:logsume起始停止值-0.4855229446507 109537862 -1; 0r1 158867881 159242170-1;0r9 3464597 3494038-2;0r10 30565643 30854992-1;0r12 12637644 14893621 1;0r20 31955124 31980522-1;0r20 32074006 32387166 1;这里的“;”只是为了显示下一行的起点。我对评论窗口有点不知所措(按enter键太多)。希望这是comprehensible@NinaHollfelder,运行
dos2unix YOURFILE.txt
。这将把文件中的换行符转换为UNIX格式,所有这些都可以正常工作。(无需手动删除^M字符。)它应该是这样的:-0.485522 chr1 109446507 109537862-1-0.361409 chr1 158867881 159242170-1-2.19458 chr9 3464597 3494038-2-0.250712 chr10 30565643 30854992-1;0.145156 chr12 12637644 14893621 1-0.387729 chr20 31955124 31980522-1;0.365632 CHR203074006 32387166 1;除了这里的第1列应该是第五列column@NinaHollfelder,很高兴这有帮助。另外,如果你发现我的答案有用,考虑把它选为“最佳答案”。(不过,@kvantour首先提出了针对
\r\n
的dos2unix解决方案。)
NR == 1 { print $0,"logsum"; next }
{
    sum = 0; n = 0; avg = 0;
    while(( getline line < fn) > 0) { 
            split(line, arr);
            if (arr[1]==$1 && arr[2]>=$2 && arr[3]<=$3) {
                    sum += arr[4]; n++;
            }
    }
    if (n>0) avg = (sum / n);
    print $0, avg;
}
awk -v fn=probes.txt -f script.awk YOURFILE.txt
Chr start stop value logsum
chr1 12345 4345666 -1 0.2725