我有这个文件
错误日志
[00:00:00.284],501,
[00:00:00.417],5,5294100071980
[00:00:02.463],501,
[00:00:05.169],501,
[00:00:05.529],501,
[00:00:05.730],501,
所以,如果字段 $3 为空,我想打印“无值”
我正在尝试这段代码
awk '{{FS=","} if($3=="") {print $1,$2,"No value"}}'
但它打印
>[00:00:00.284] 501 No value
>[00:00:02.463] 501 No value
>[00:00:05.169] 501 No value
>[00:00:05.529] 501 No value
>[00:00:05.730] 501 No value
>[00:00:07.193] 501 No value
>[00:00:09.899] 501 No value
>[00:00:31.312] 501 No value
awk -F ',' -v OFS=',' '$1 { if ($3=="") $3="No value"; print}' in.txt
- 通过字段分隔符传递
-F
option.
- 多变的
OFS
,输出字段分隔符,设置为,
,因此输出字段也由,
.
- Pattern
$1
确保仅处理非空行(即,仅当第一个字段非空时才执行关联操作) -如果您的输入文件没有空行,您可以删除此模式.
- 如果第三个字段为空,则为其分配字符串“No value”
- 最后,输出该行(带有可能修改的第三个字段)。
以上是我建议您解决问题的方法,但以下是原始命令的问题:
-
{{FS=","}...
在您的单个操作中 - 由于没有为每个输入行执行前面的模式 - 您设置变量FS
对于每一行- 这不仅是不必要的,而且too late,因为当时第一个输入行已经被解析(谢谢,@EdMorton) - 或者将其设置为BEGIN
block (BEGIN { FS="," }
)或者,如我的回答,使用命令行选项-F
(-F ','
).
-
if($3=="") {...}
仅当字段时才产生输出$3
是空的 - 不过,大概你想输出all线,所以用这种方法你需要一个else
分支(打印未修改的行)。
-
print $1,$2,"No value"
The ,
字符。这是语法的一部分 - 它们只是分隔传递给的参数print
。鉴于单独的论点,print
将它们与特殊的值连接起来OFS
变量,其值为单个space默认情况下;使用,
相反,你必须将它分配给OFS
- 再次,无论是在BEGIN
块或通过-v
选项 (-v OFS=','
).
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)