输入:
[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)}'
我想将第一个字段填充到4个字符的十六进制数字?我该怎么办?
输入本身已经是4个字符的十六进制。在这种情况下,它应该保持原样。
另外,有没有办法将sed和awk合并为一个命令?
谢谢!
答案 0 :(得分:3)
此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 ...
在所需的输出中打印所需的值答案 1 :(得分:0)
您可以使用 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
答案 2 :(得分:0)
这是另一个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 }
答案 3 :(得分:0)
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版本为{GNU sed <{1}}
答案 4 :(得分:0)
如果你使用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
答案 5 :(得分:0)
您可以使用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
答案 6 :(得分:0)
使用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