Bash 从awk中的多个特定列中减去单个最大数

Bash 从awk中的多个特定列中减去单个最大数,bash,unix,awk,min,Bash,Unix,Awk,Min,我有一个逗号分隔的文件 R,F,TE,K,G,R 1,0,12,f,1,18 2,1,17,t, ,17 3,1, , ,1, 4,0,15, ,0,16 有些项目丢失了,而且第一行是我想忽略的标题。我想计算特定列中的第二个最小值,并从该列中的所有元素中减去它,除非该列中的值是最小值。在本例中,我想从示例中的第3列和第6列中减去第二个最小值。因此,我的最终价值观是: R,F,TE,K,G,R 1,0,12,f,1,1 2,1, 2,t, ,0 3,1, , ,0, 4,0, 0, ,0,16

我有一个逗号分隔的文件

R,F,TE,K,G,R
1,0,12,f,1,18
2,1,17,t, ,17
3,1,  , ,1,
4,0,15, ,0,16
有些项目丢失了,而且第一行是我想忽略的标题。我想计算特定列中的第二个最小值,并从该列中的所有元素中减去它,除非该列中的值是最小值。在本例中,我想从示例中的第3列和第6列中减去第二个最小值。因此,我的最终价值观是:

R,F,TE,K,G,R
1,0,12,f,1,1
2,1, 2,t, ,0
3,1, , ,0,
4,0, 0, ,0,16
我尝试单独使用单列,并给出手动编码的阈值,使其在

awk 'BEGIN {FS=OFS=","; 
};
{ min=1000000; 
 if($3<min && $3 != "" && $3>12) min = $3; 
 if($3>0) $3 = $3-min+1;
 print}
 END{print min}
 ' try1.txt
awk'BEGIN{FS=OFS=“,”;
};
{min=1000000;
如果(312美元)最小值=3美元;
如果($3>0)$3=$3分钟+1;
打印}
结束{print min}
'try1.txt
它可以找到最小值,但输出不符合预期。在awk中应该有一种更简单的方法

开始{
BEGIN{
    FS=OFS=","
}
{
    if(NR==1){print;next}
    if(+$3)a[NR]=$3
    if(+$6)b[NR]=$6
    s[NR]=$0
}
END{
    asort(a,c)
    asort(b,d)
    for(i=2;i<=NR;i++){
        split(s[i],t)
        if(t[3]!=c[1]&&+t[3]!=0)t[3]=t[3]-c[2]
        if(t[6]!=d[1]&&+t[6]!=0)t[6]=t[6]-d[2]
        print t[1],t[2],t[3],t[4],t[5],t[6]
    }
}
FS=OFS=“,” } { 如果(NR==1){print;next} 如果(+$3)a[NR]=3美元 如果(+$6)b[NR]=$6 s[NR]=$0 } 结束{ asort(a,c) 阿索尔(b,d) 对于(i=2;i
BEGIN{
FS=OFS=“,”
}
{
如果(NR==1){print;next}
如果(+$3)a[NR]=3美元
如果(+$6)b[NR]=$6
s[NR]=$0
}
结束{
asort(a,c)
阿索尔(b,d)
对于(i=2;i
BEGIN{
FS=OFS=“,”
}
{
如果(NR==1){print;next}
如果(+$3)a[NR]=3美元
如果(+$6)b[NR]=$6
s[NR]=$0
}
结束{
asort(a,c)
阿索尔(b,d)
对于(i=2;i
BEGIN{
FS=OFS=“,”
}
{
如果(NR==1){print;next}
如果(+$3)a[NR]=3美元
如果(+$6)b[NR]=$6
s[NR]=$0
}
结束{
asort(a,c)
阿索尔(b,d)

对于(i=2;i我会在文件上循环两次,一次找到最小值,一次调整值。这是时间与内存的折衷

awk -F, -v OFS=, '
    NR == 1    {min3 = $3; min6 = $6} 
    NR == FNR  {if ($3 < min3) min3 = $3; if ($6 < min6) min6 = $6; next}
    $3 != min3 {$3 -= min3}
    $6 != min6 {$6 -= min6}
    {print}
' try1.txt try1.txt

我会在文件上循环两次,一次找到最小值,一次调整值。这是时间和内存的折衷

awk -F, -v OFS=, '
    NR == 1    {min3 = $3; min6 = $6} 
    NR == FNR  {if ($3 < min3) min3 = $3; if ($6 < min6) min6 = $6; next}
    $3 != min3 {$3 -= min3}
    $6 != min6 {$6 -= min6}
    {print}
' try1.txt try1.txt

我会在文件上循环两次,一次找到最小值,一次调整值。这是时间和内存的折衷

awk -F, -v OFS=, '
    NR == 1    {min3 = $3; min6 = $6} 
    NR == FNR  {if ($3 < min3) min3 = $3; if ($6 < min6) min6 = $6; next}
    $3 != min3 {$3 -= min3}
    $6 != min6 {$6 -= min6}
    {print}
' try1.txt try1.txt

我会在文件上循环两次,一次找到最小值,一次调整值。这是时间和内存的折衷

awk -F, -v OFS=, '
    NR == 1    {min3 = $3; min6 = $6} 
    NR == FNR  {if ($3 < min3) min3 = $3; if ($6 < min6) min6 = $6; next}
    $3 != min3 {$3 -= min3}
    $6 != min6 {$6 -= min6}
    {print}
' try1.txt try1.txt


谢谢!我已向上投票。但是,当某些值丢失时,这似乎不起作用。我已相应地更新了问题。很抱歉,没有提前询问它!谢谢!我已向上投票。但当某些值丢失时,这似乎不起作用。我已相应地更新了问题。很抱歉,没有提前询问它!谢谢!我已向上投票。但这当某些值丢失时似乎不起作用。我已相应地更新了问题。很抱歉,没有提前询问它!谢谢!我已提前投票。但当某些值丢失时,这似乎不起作用。我已相应地更新了问题。很抱歉,没有提前询问它!谢谢!但是,我想减去第二个最小值,不是最小的。而且,当缺少一些值时,它不起作用。我已相应地更新了问题。再次测试?@LoveDynaSty由于您正在检查零,所以当有零时它不起作用。这些情况下有什么解决方法吗?谢谢!但是,我想减去第二个最小值,而不是最小值。另外,它是d当缺少一些值时,oes不起作用。我已相应地更新了问题。是否再次测试?@LoveDynaSty由于您正在检查零,所以当有零时,它不起作用。这些情况下有任何解决方法吗?谢谢!但是,我想减去第二个最小值,而不是最小值。此外,当有零时,它也不起作用缺少值。我已相应地更新了问题。是否再次测试?@LoveDynaSty由于您正在检查零,因此当存在零时,它不起作用。这些情况下有任何解决方法吗?谢谢!但是,我想减去第二个最小值,而不是最小值。此外,当某些值缺少时,它也不起作用。我已更新了e问相应的问题。再次测试?@LoveDynaSty由于您正在检查零,所以当有零时,它不起作用。这些情况下有什么解决方法吗?您想从每个值中减去第二小的数字,除非该值是最小的,对吗?您想从每个值中减去第二小的数字,除非该值是最小的st,对吗?你想从每个值中减去第二小的数字,除非值是最小的,对吗?你想从每个值中减去第二小的数字,除非值是最小的,对吗?