Shell脚本 - 循环遍历csv文件的多个列中的值

时间:2017-05-05 08:24:11

标签: bash shell csv awk

我正在使用包含两列的巨大CSV文件(filename.csv)。从第1列开始,我想读取当前行并将其与前一行的值进行比较。如果是greaterequal,继续比较,如果当前单元格的值是smaller而不是前一行 - 那么我想跳转到第二列并取值当前行(第二列)。接下来,我想将第1列中的值larger value除以第二列的同一单元格中的值。例如,在下表中:根据我的要求,我们将获得的较小值是327(因为327小于先前的值340) - 然后我们取500(这是第二列上的相应单元格值)。最后我们将340除以500得到值0.68。在我们将值打印到控制台后,我的bash脚本应该立即退出。

338  800
338  550
339  670
340  600 
327  500
301  430
299  350
284  339
284  338
283  335
283  330
283  310
282  310
282  300
282  300
283  290

在下面的脚本中,它仅适用于第1列,但我想根据我上面提到的标准将其扩展为两列。

awk '$1<p{ 
    val=$1/p                   
    if(val>=0.8 && val<=0.9)
        {
            print "value is:" $1/p
            print "A"
        }
    else if(val==0.8)
        {
            print "B"
        }
    else if(val>=0.6 && val <=0.7)
        {
            print "C" 

        }
    else if(val==0.5)
        {
            print "E"
        }
    else
        {
            print "D" 
        }
    exit
    }
    { 
        p=$1 
    }' filetest.csv

我们如何循环遍历两列中的值并执行控制语句?

PS:我的if-else语句的标准是(如果值>&gt; = 0.8且&lt; = 0.9,打印A,否则,如果值)>> 0.7且<= 0.8,打印B ,如果值>> 0.5且&lt; = 0.7则打印C,否则打印D)。

1 个答案:

答案 0 :(得分:1)

您的第一个预期值0.654大于0.65(第三个条件是最接近的条件),这就是为什么它不适合您的任何条件。

扩展您的脚本,如下所示:

awk '$1<p{ 
    val=$1/$2  # to divide the first column value on the second column value              
    if(val>=0.85 && val<=0.9)
        {
            print "value is:" $1/p
            print "A"
        }
    else if(val==0.8)
        {
            print "B"
        }
    else if(val>=0.5 && val <=0.7)
        {
            print "C" 

        }
    else if(val==0.5)
        {
            print "E"
        }
    else
        {
            print "D" 
        }
    exit
    }
    { 
        p=$1 
    }' filetest.csv

输出:

C

我修改的关键路线是:

val=$1/$2  # to divide the first column value on the second column value
相关问题