在输出输出之前对变量进行操作

时间:2019-02-23 11:50:48

标签: awk

我想在awk进程中将条件应用于变量。

如何在代码中添加以下条件,才能在打印输出文件之前对值变量(x1)和(x2)进行操作。

  #if{(x1>101) x1="AAA"}
  #if{(x2>104) x2="BBB"}

我想保持代码不变,以确保有更好的方法执行相同的输出,但是在这种情况下,我想知道如何在变量中进行操作。

输入文件

3141 37150 100 10100 1 4
3141 37201 100 12100 1 4
3144 37471 100 14100 2 5
3141 37471 100 14100 0 6
3141 37471 100 14100 5 6
3141 37471 100 14100 1 7
3142 37471 100 14100 3 8
3143 37471 100 14100 1 1

我使用的代码

awk '{
    tt1 = $1
    tt2 = $2
        tt3 = $3
    tt4 = $4
    tt5 = $5
    tt6 = $6
    x1 = tt3 + tt5
    x2 = tt3 + tt6 
    x3 = tt3 + tt2 

  #if{(x1>101) x1="AAA"}
  #if{(x2>104) x2="BBB"}

    x6 = x3 + 5000                       
    printf("%5d %5d %5d %5d %5d %5d %5d %5d %5d %5d\n", tt1,tt2,tt3,tt4,x1,x2,x3,tt5,tt6,x5)}' file1 | awk -v OFS=',' '{$1=$1}1' 

输出文件

3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,102,105,37571,2,5,42571
3141,37471,100,14100,100,106,37571,0,6,42571
3141,37471,100,14100,105,106,37571,5,6,42571
3141,37471,100,14100,101,107,37571,1,7,42571
3142,37471,100,14100,103,108,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571

所需的输出

3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,AAA,BBB,37571,2,5,42571
3141,37471,100,14100,100,BBB,37571,0,6,42571
3141,37471,100,14100,AAA,BBB,37571,5,6,42571
3141,37471,100,14100,101,BBB,37571,1,7,42571
3142,37471,100,14100,AAA,BBB,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571

预先感谢

1 个答案:

答案 0 :(得分:1)

尽管我知道您正在要求改进代码。恕我直言,最好的方法是使用printf函数,并且只有在没有大型程序需要使用这些变量的情况下,才可以避免使用过多的变量(我们从列/字段值中获取这些变量) ),稍后再编程。

awk '{printf("%d,%d,%d,%d,%s,%s,%d,%d,%d,%d\n",\
      $1,$2,$3,$4,\
      $3+$(NF-1)>101?"AAA":$3+$(NF-1),\
      $3+$NF>104?"BBB":$3+$NF,\
      $2+100,$5,$6,$2+5000+$3)
}'  Input_file

输出如下。

3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,AAA,BBB,37571,2,5,42571
3141,37471,100,14100,100,BBB,37571,0,6,42571
3141,37471,100,14100,AAA,BBB,37571,5,6,42571
3141,37471,100,14100,101,BBB,37571,1,7,42571
3142,37471,100,14100,AAA,BBB,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571


编辑: :此处更正了OP的尝试。

OP的正确的代码解决方案如下:

awk '{
    tt1 = $1
    tt2 = $2
    tt3 = $3
    tt4 = $4
    tt5 = $5
    tt6 = $6
    x1 = tt3 + tt5
    x2 = tt3 + tt6 
    x3 = tt3 + tt2 
    x5=  x3 + 5000
  if(x1>101){x1="AAA"}
  if(x2>104){x2="BBB"}
    printf("%d,%d,%d,%d,%s,%s,%d,%d,%d,%d\n", tt1,tt2,tt3,tt4,x1,x2,x3,tt5,tt6,x5)}'  Input_file

输出如下。

3141,37150,100,10100,101,104,37250,1,4,42250
3141,37201,100,12100,101,104,37301,1,4,42301
3144,37471,100,14100,AAA,BBB,37571,2,5,42571
3141,37471,100,14100,100,BBB,37571,0,6,42571
3141,37471,100,14100,AAA,BBB,37571,5,6,42571
3141,37471,100,14100,101,BBB,37571,1,7,42571
3142,37471,100,14100,AAA,BBB,37571,3,8,42571
3143,37471,100,14100,101,101,37571,1,1,42571

OP代码中已解决的问题:

1-删除了%5d,并将其更改为%d,以删除不必要的空格以减少十位数的打印。

2- printf中的固定定界符将它们之间更改为,

3-删除了变量x6,似乎从未使用过,将其更改为x5

4-更改了if条件的语法。似乎语法不正确,因为它已从if{.....)更改为if(....)

5-删除了以上代码更改后未使用的多余awk