[英]bash - awk padding a hex number with zeroes
输入:
[0x000] : {foo ,bar ,0x0000000000a00000 ,abcd ,143 ,65535 }
[0x001] : {foo ,blah ,0x0000000001e00000 ,abcd ,142 ,65535 }
[0x002] : {foo ,bar ,0x0000000003000000 ,abcd ,141 ,155 }
[0x003] : {foo ,bar ,0x0000000003000000 ,abcd ,144 ,156 }
期望的输出:
0x0000 N/A 143
0x0002 155 141
0x0003 156 144
目前正在使用: sed -e 's/65535/N\\/A/g' -e 's/[][},]//g' | awk '/foo/ {print $1,$NF,$(NF-1)}'
sed -e 's/65535/N\\/A/g' -e 's/[][},]//g' | awk '/foo/ {print $1,$NF,$(NF-1)}'
我想将第一个字段填充到4个字符的十六进制数字? 我该怎么办?
输入本身可以是4个字符的十六进制。 在这种情况下,它应该保持原样。
还有,有没有办法将sed和awk合并为一个命令?
谢谢!
这个awk
系列应该单独完成:
awk 'BEGIN{FS="[ \t,:{}\\[\\]x]+"} $10==65535{$10="N/A"} {printf "0x%.4x %s %s\n", $3, $10, $9}'
与mawk
和gawk
。
说明:
BEGIN{FS=...}
设置字段分隔符<space>
, <tab>
, ,
[
, ]
, :
, {
, }
和x
。 $10==65535{$8="N/A"}
如果第10个变量等于65535,则设置为N/A
printf ...
在所需的输出中打印所需的值 您可以使用mawk ,我刚刚修改了您的脚本,但是您可以使用awk
(在本例中为mawk
)本身完成所有这些操作:
(sed -e 's/65535/N\/A/g' -e 's/[][},]//g' | mawk '/foo/ {printf ("0x%04x %s %s\n", $1,$NF,$(NF-1))}') < File
这是另一个awk
awk -F, '$6+0=="65535" {split($1,a,"[][]");$0=(length(a[2])==6?a[2]:"0x0"substr(a[2],3,4)) " N/A " $5}1' file
0x0000 N/A 143
0x2001 N/A 142
0x0002 N/A 141
如果行包含65535
更改它,如果不是只打印它。
测试十六进制的长度是否为6
字符,如果是,则使用它。
如果没有,请为它填一个额外的0
。
示例数据:
cat file
[0x000] : {foo ,bar ,0x0000000000a00000 ,abcd ,143 ,65535 }
[0x2001] : {foo ,bar ,0x0000000001e00000 ,abcd ,142 ,65535 }
[0x002] : {foo ,bar ,0x0000000003000000 ,abcd ,141 ,65535 }
This line should not be modified
[0x002] : {foo ,bar ,0x0000000003000000 ,abcd ,141 ,65533 }
awk -F, '$6+0=="65535" {split($1,a,"[][]");$0=(length(a[2])==6?a[2]:"0x0"substr(a[2],3,4)) " N/A " $5}1' file
0x0000 N/A 143
0x2001 N/A 142
0x0002 N/A 141
This line should not be modified
[0x002] : {foo ,bar ,0x0000000003000000 ,abcd ,141 ,65533 }
sed 's#\[0x\([[:xdigit:]]*\)].*,\([0-9]\{1,\}\)[[:space:]]*,[^,]*#0x0\1 N/A \2#;s/0x0\([[:xdigit:]]\{4\}\)/0x\1/' YourFile
,
(使用sed模式行为)并重新格式化2组的内容
而不是[[:space:]]
如果使用空格字符而不是制表符,则使用[0-9a-f]
代替[[:xdigit:]]
Posix版本所以--posix
用于GNU sed
如果你使用perl,请使用以下命令:
perl -lane '$F[6]=~s/,/N\/A /g;
if($F[7]=~/65535/){printf "0x%04s $F[6]\n", $1 if(/^\[0x([^\]]*)\]/)}
else{print}' your_file
你可以使用printf
:
printf "0x%.4x %s %s\n" $(sed -e 's/65535/N\/A/g' -e 's/[][},]//g' input | awk '/foo/ {print $1,$NF,$(NF-1)}')
0x0000 N/A 143
0x0001 N/A 142
0x0002 N/A 141
注意:我在此重复使用您之前的工作,只将其输出发送到printf
使用GNU awk处理非十进制输入数据:
$ awk --non-decimal-data -F'[][ ,]+' '/foo/{printf "0x%04x %s %s\n", $2, ($9==65535?"N/A":$9), $8}' file
0x0000 N/A 143
0x0001 N/A 142
0x0002 N/A 141
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.