如何从第二行使用 awk '{print $1*Number}' 或告诉他忽略 NaN 值?

How to use awk '{print $1*Number}' from the second line or telling him to ignore NaN values?

我有一个名为 'waterproofposters.jsonl' 的文件,其输出类型为:

Regular price
100
200
300
400
500

而且我需要取出每个值的2%。我使用了以下代码:

awk '{print *0.98}' waterproofposters.jsonl 

然后我得到以下输出:

0
98
196
294
392
490

然后我卡住了,因为我需要在第一行中使用 'Regular price' 而不是 '0'

我想使用

将“0”替换为“正常价格”
find . -name "waterproof.jsonl" | xargs sed -i -e 's/0/Regular price/g'

但它会将所有'0'替换为'Regular price'

按原样打印第一行:

awk '{print (NR>1 ? [=10=]*0.98 : [=10=])}'

按原样打印不是数字的行:

awk '{print ([=11=]+0 == [=11=] ? [=11=]*0.98 : [=11=])}'

我在乘法中使用 [=17=] 而不是 </code> 因为:</p> <ol> <li>它们在您的数字输入中是相同的,并且</li> <li>在美学上我更喜欢在整个脚本中使用相同的值,而不是数字行和非数字行使用不同的值,并且</li> <li>当您使用特定字段时,它会导致 awk 进行字段拆分,因此在整个记录都可以时不引用字段会更有效。</li> </ol> <p>以下是以上两个使用发布的样本输入的方法:</p> <pre><code>$ awk '{print (NR>1 ? [=12=]*0.98 : [=12=])}' file Regular price 98 196 294 392 490

$ awk '{print ([=13=]+0 == [=13=] ? [=13=]*0.98 : [=13=])}' file
Regular price
98
196
294
392
490

这是在输入文件中具有非数值的两个给定输入之间的区别:

$ cat file
Regular price
100
200
foobar
400
500

$ awk '{print (NR>1 ? [=15=]*0.98 : [=15=])}' file
Regular price
98
196
0
392
490

$ awk '{print ([=16=]+0 == [=16=] ? [=16=]*0.98 : [=16=])}' file
Regular price
98
196
foobar
392
490

您当然可以实现您所需要的 ,但是为什么您的 sed -i -e 's/0/Regular price/g' 命令没有按预期工作的原因是您使用了 0 作为正则表达式模式。 0 匹配字符串中的任何零字符。

您想替换一行中唯一的字符 0

因此,您需要使用^$锚点来分别匹配行的开始和结束:

sed -i 's/^0$/Regular price/'

如果只需要替换第一行的s替换命令之前添加1地址:

sed -i '1 s/^0$/Regular price/'

请注意,您不需要 g,因为您只希望每行进行一次替换,并且仅当在一行上执行多次替换时才需要 g。默认情况下,将处理所有行。

如何从第二行开始使用awk '{print $1Number}' 或者告诉他忽略NaN值?*

我会按照使用 GNU AWK 的方式进行操作,令 file.txt 内容为

Regular price
100
200
300
400
500

然后

awk 'NR==1{print}NR>=2{print *0.98}' file.txt

产出

Regular price
98
196
294
392
490

说明:如果是第一行就打印它,如果是第二行或之后的行打印第一列值的 0.98

(在 GNU Awk 5.0.1 中测试)