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

Ais*_*ssa 2 linux bash awk xargs

我有一个名为“waterproofposters.jsonl”的文件,具有这种类型的输出:

Regular price
100
200
300
400
500
Run Code Online (Sandbox Code Playgroud)

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

awk '{print $1*0.98}' waterproofposters.jsonl 
Run Code Online (Sandbox Code Playgroud)

然后我有以下输出:

0
98
196
294
392
490
Run Code Online (Sandbox Code Playgroud)

然后我被卡住了,因为我需要在第一行使用“常规价格”而不是“0”

我想用“常规价格”替换“0”

find . -name "waterproof.jsonl" | xargs sed -i -e 's/0/Regular price/g'
Run Code Online (Sandbox Code Playgroud)

但它会用“正常价格”替换所有的“0”

Ed *_*ton 6

要按原样打印第一行:

awk '{print (NR>1 ? $0*0.98 : $0)}'
Run Code Online (Sandbox Code Playgroud)

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

awk '{print ($0+0 == $0 ? $0*0.98 : $0)}'
Run Code Online (Sandbox Code Playgroud)

我在乘法中使用$0而不是$1因为:

  1. 它们在您的数字输入中是相同的,并且
  2. 从美学上讲,我更喜欢在整个脚本中使用相同的值,而不是对数字行与非数字行使用不同的值,并且
  3. 当您使用特定字段时,它会导致 awk 进行字段拆分,因此在整个记录都可以执行时不引用字段会更有效率。

以下是与发布的示例输入一起使用的上述两个:

$ awk '{print (NR>1 ? $0*0.98 : $0)}' file
Regular price
98
196
294
392
490
Run Code Online (Sandbox Code Playgroud)

$ awk '{print ($0+0 == $0 ? $0*0.98 : $0)}' file
Regular price
98
196
294
392
490
Run Code Online (Sandbox Code Playgroud)

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

$ cat file
Regular price
100
200
foobar
400
500
Run Code Online (Sandbox Code Playgroud)

$ awk '{print (NR>1 ? $0*0.98 : $0)}' file
Regular price
98
196
0
392
490
Run Code Online (Sandbox Code Playgroud)

$ awk '{print ($0+0 == $0 ? $0*0.98 : $0)}' file
Regular price
98
196
foobar
392
490
Run Code Online (Sandbox Code Playgroud)