我想在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
预先感谢
答案 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
。