如何从第二行使用 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 中测试)
我有一个名为 '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 中测试)