具有计算值和数字范围的 awk 过滤列 |更新
awk filter columns with calculated values and number range | updated
嗨,我不知道如何从给定的结果中获得预期的输出
输入文件,当前代码给出输出但需要有预期的一个
input file awk code output
--------
3700 TEXT_0A 34 NA NA | 3700 TEXT_0A 34 NA NA 850
3721 TEXT_0A 55 ete 851 | 3721 TEXT_0A 55 ete 851 850
3701 TEXT_0A 100 NA NA | 3701 TEXT_0A 100 NA NA 850
3724 TEXT_0A 150 ete 1275 | 3724 TEXT_0A 150 ete 1275 1275
3713 TEXT_0A 170 ete 1445 | 3713 TEXT_0A 170 ete 1445 1445
25 TEXT_XA 200 ete 822 | 3686 TEXT_0A 200 ete 822 1700
3686 TEXT_0A 200 ete 822 | 3692 TEXT_0A 200 ete 1700 1700
3692 TEXT_0A 200 ete 1700 | 3716 TEXT_0A 200 ete 3000 1700
3716 TEXT_0A 200 ete 3000 | 3688 TEXT_0A 250 ete 822 1875
88 TEXT_AF 250 ete 822 | 3708 TEXT_0A 300 ete 2250 2250
69 DNTT_AF 250 ete 822 | 3704 TEXT_0A 304 ete 2280 2280
3688 TEXT_0A 250 ete 822 | 3705 TEXT_0A 304 ete 2350 2280
3708 TEXT_0A 300 ete 2250 | 3689 TEXT_0A 400 ete 3000 3000
3704 TEXT_0A 304 ete 2280 | 3717 TEXT_0A 400 ete 3002 3000
3705 TEXT_0A 304 ete 2350 | 3706 TEXT_0A 404 ete 3030 3030
3689 TEXT_0A 400 ete 3000 | 3696 TEXT_0A 500 ete 3750 3750
3717 TEXT_0A 400 ete 3002 | 3707 TEXT_0A 650 ete 4500 4875
3706 TEXT_0A 404 ete 3030 | 3720 TEXT_0A 800 ete 3000 6000
3696 TEXT_0A 500 ete 3750 | 3694 TEXT_0A 1000 ete 7500 7500
3707 TEXT_0A 649.5 ete 4500 |
3720 TEXT_0A 800 ete 3000 |
3694 TEXT_0A 1000 ete 7500 |
过滤规则:
- 过滤包含字符串 _0A 的行并排除包含
DNTT _AF _XA 基于列 $3 <=100 分配给输出列 $6
固定值 850
- 基于列 $3 > 100 && $3 <=200 在此数字范围内
分配给输出列 $6 计算值 $3*8.5
- 基于列 $3 > 200 && $3 <=1000 在此数字范围内
分配给输出列 $6 计算值 $3*7.5
- 如果不相等列,将其过滤为预期输出
低于 5 美元和 6 美元
预期输出:
3700 TEXT_0A 34 NA NA 850
3721 TEXT_0A 55 ete 851 850
3701 TEXT_0A 100 NA NA 850
3686 TEXT_0A 200 ete 822 1700
3716 TEXT_0A 200 ete 3000 1700
3688 TEXT_0A 250 ete 822 1875
3705 TEXT_0A 304 ete 2350 2280
3717 TEXT_0A 400 ete 3002 3000
3707 TEXT_0A 650 ete 4500 4875
3720 TEXT_0A 800 ete 3000 6000
部分工作代码:
awk '{if (( ~ /_0A/ && !/DNTT|_AF|_XA/ && <=100 )) \
printf ("%s %s %.0f %s %s %.0f\n",,,,,,850); \
else if (( ~ /_0A/ && !/DNTT|_AF|_XA/ && > 100 && <=200 )) \
printf ("%s %s %.0f %s %s %.0f\n",,,,,,*8.5); \
else if (( ~ /_0A/ && !/DNTT|_AF|_XA/ && > 200 && <=1000 )) \
printf ("%s %s %.0f %s %s %.0f\n",,,,,,*7.5)}' file2 | column -t
读取 1 到 4 行,并将其转换为 awk:
gawk '[=11=]~"_0A" && [=11=]!~"DNTT"{ =((>100 && <=200)?(*8.5):(>200 && <=1000?(*7.5):850)); if(!=){ print }}' input.txt
输出:
3700 TEXT_0A 34 NA NA 850
3721 TEXT_0A 55 ete 851 850
3701 TEXT_0A 100 NA NA 850
3686 TEXT_0A 200 ete 822 1700
3716 TEXT_0A 200 ete 3000 1700
3688 TEXT_0A 250 ete 822 1875
3705 TEXT_0A 304 ete 2350 2280
3717 TEXT_0A 400 ete 3002 3000
3707 TEXT_0A 649.5 ete 4500 4871.25
3720 TEXT_0A 800 ete 3000 6000
一个 if 语句 (if a=b then c else d;
) 也可以写成 (a=b?c:d
)
注意:您必须排除 _AF _XA
,我不清楚,因为没有看到 _XA
。这就是为什么我排除了 DNTT
.
您可以使用这个 awk
:
cat calc.awk
~ /_0A/ && !/DNTT|_AF|_XA/ {
if ( <=100 )
n = 850
else if ( > 100 && <=200 )
n = *8.5
else if ( > 200 && <=1000 )
n = *7.5
if ( != n)
printf ("%s %s %.0f %s %s %.0f\n",,,,,,n)
}
然后将其用作:
awk -f calc.awk file | column -t
3700 TEXT_0A 34 NA NA 850
3721 TEXT_0A 55 ete 851 850
3701 TEXT_0A 100 NA NA 850
3686 TEXT_0A 200 ete 822 1700
3716 TEXT_0A 200 ete 3000 1700
3688 TEXT_0A 250 ete 822 1875
3705 TEXT_0A 304 ete 2350 2280
3717 TEXT_0A 400 ete 3002 3000
3707 TEXT_0A 650 ete 4500 4871
3720 TEXT_0A 800 ete 3000 6000
嗨,我不知道如何从给定的结果中获得预期的输出 输入文件,当前代码给出输出但需要有预期的一个
input file awk code output
--------
3700 TEXT_0A 34 NA NA | 3700 TEXT_0A 34 NA NA 850
3721 TEXT_0A 55 ete 851 | 3721 TEXT_0A 55 ete 851 850
3701 TEXT_0A 100 NA NA | 3701 TEXT_0A 100 NA NA 850
3724 TEXT_0A 150 ete 1275 | 3724 TEXT_0A 150 ete 1275 1275
3713 TEXT_0A 170 ete 1445 | 3713 TEXT_0A 170 ete 1445 1445
25 TEXT_XA 200 ete 822 | 3686 TEXT_0A 200 ete 822 1700
3686 TEXT_0A 200 ete 822 | 3692 TEXT_0A 200 ete 1700 1700
3692 TEXT_0A 200 ete 1700 | 3716 TEXT_0A 200 ete 3000 1700
3716 TEXT_0A 200 ete 3000 | 3688 TEXT_0A 250 ete 822 1875
88 TEXT_AF 250 ete 822 | 3708 TEXT_0A 300 ete 2250 2250
69 DNTT_AF 250 ete 822 | 3704 TEXT_0A 304 ete 2280 2280
3688 TEXT_0A 250 ete 822 | 3705 TEXT_0A 304 ete 2350 2280
3708 TEXT_0A 300 ete 2250 | 3689 TEXT_0A 400 ete 3000 3000
3704 TEXT_0A 304 ete 2280 | 3717 TEXT_0A 400 ete 3002 3000
3705 TEXT_0A 304 ete 2350 | 3706 TEXT_0A 404 ete 3030 3030
3689 TEXT_0A 400 ete 3000 | 3696 TEXT_0A 500 ete 3750 3750
3717 TEXT_0A 400 ete 3002 | 3707 TEXT_0A 650 ete 4500 4875
3706 TEXT_0A 404 ete 3030 | 3720 TEXT_0A 800 ete 3000 6000
3696 TEXT_0A 500 ete 3750 | 3694 TEXT_0A 1000 ete 7500 7500
3707 TEXT_0A 649.5 ete 4500 |
3720 TEXT_0A 800 ete 3000 |
3694 TEXT_0A 1000 ete 7500 |
过滤规则:
- 过滤包含字符串 _0A 的行并排除包含 DNTT _AF _XA 基于列 $3 <=100 分配给输出列 $6 固定值 850
- 基于列 $3 > 100 && $3 <=200 在此数字范围内 分配给输出列 $6 计算值 $3*8.5
- 基于列 $3 > 200 && $3 <=1000 在此数字范围内 分配给输出列 $6 计算值 $3*7.5
- 如果不相等列,将其过滤为预期输出 低于 5 美元和 6 美元
预期输出:
3700 TEXT_0A 34 NA NA 850
3721 TEXT_0A 55 ete 851 850
3701 TEXT_0A 100 NA NA 850
3686 TEXT_0A 200 ete 822 1700
3716 TEXT_0A 200 ete 3000 1700
3688 TEXT_0A 250 ete 822 1875
3705 TEXT_0A 304 ete 2350 2280
3717 TEXT_0A 400 ete 3002 3000
3707 TEXT_0A 650 ete 4500 4875
3720 TEXT_0A 800 ete 3000 6000
部分工作代码:
awk '{if (( ~ /_0A/ && !/DNTT|_AF|_XA/ && <=100 )) \
printf ("%s %s %.0f %s %s %.0f\n",,,,,,850); \
else if (( ~ /_0A/ && !/DNTT|_AF|_XA/ && > 100 && <=200 )) \
printf ("%s %s %.0f %s %s %.0f\n",,,,,,*8.5); \
else if (( ~ /_0A/ && !/DNTT|_AF|_XA/ && > 200 && <=1000 )) \
printf ("%s %s %.0f %s %s %.0f\n",,,,,,*7.5)}' file2 | column -t
读取 1 到 4 行,并将其转换为 awk:
gawk '[=11=]~"_0A" && [=11=]!~"DNTT"{ =((>100 && <=200)?(*8.5):(>200 && <=1000?(*7.5):850)); if(!=){ print }}' input.txt
输出:
3700 TEXT_0A 34 NA NA 850
3721 TEXT_0A 55 ete 851 850
3701 TEXT_0A 100 NA NA 850
3686 TEXT_0A 200 ete 822 1700
3716 TEXT_0A 200 ete 3000 1700
3688 TEXT_0A 250 ete 822 1875
3705 TEXT_0A 304 ete 2350 2280
3717 TEXT_0A 400 ete 3002 3000
3707 TEXT_0A 649.5 ete 4500 4871.25
3720 TEXT_0A 800 ete 3000 6000
一个 if 语句 (if a=b then c else d;
) 也可以写成 (a=b?c:d
)
注意:您必须排除 _AF _XA
,我不清楚,因为没有看到 _XA
。这就是为什么我排除了 DNTT
.
您可以使用这个 awk
:
cat calc.awk
~ /_0A/ && !/DNTT|_AF|_XA/ {
if ( <=100 )
n = 850
else if ( > 100 && <=200 )
n = *8.5
else if ( > 200 && <=1000 )
n = *7.5
if ( != n)
printf ("%s %s %.0f %s %s %.0f\n",,,,,,n)
}
然后将其用作:
awk -f calc.awk file | column -t
3700 TEXT_0A 34 NA NA 850
3721 TEXT_0A 55 ete 851 850
3701 TEXT_0A 100 NA NA 850
3686 TEXT_0A 200 ete 822 1700
3716 TEXT_0A 200 ete 3000 1700
3688 TEXT_0A 250 ete 822 1875
3705 TEXT_0A 304 ete 2350 2280
3717 TEXT_0A 400 ete 3002 3000
3707 TEXT_0A 650 ete 4500 4871
3720 TEXT_0A 800 ete 3000 6000