如何将文件中的列值转换为十六进制字节翻转格式

时间:2014-01-29 12:37:23

标签: shell sed awk

输入文件:

0 2950|abc|def|0|    
0 2564|abc|def|0|

输出文件:

转换后附加0000,即我希望输出为:

0000860B0000|abc|def|0|
0000040A0000|abc|def|0|

仅更改第一列。我可以使用print命令转换值。但是,如何将其仅应用于上述给定输入格式的整个文件的第一列 在shell脚本中?

好的我正在解释第一列的转换过程,例如0 2950 ,我已经制作了0的十六进制,即0000并将其翻转,即0000(00 00)和2950(0B86)的十六进制 翻转它860B (86 0B)并且将它们连接起来,即0000860B,并且因为我想要12字节字,所以i< ll< ll附加其余的0' s,0000860B0000。希望它能清除每个人的要求。

3 个答案:

答案 0 :(得分:3)

正如我评论的那样,要求并非100%明确,但是对于您问题中的示例(值< = FFFF),此(gnu)awk行有效:

awk -F'|' -v OFS="|" '{
sub(/^\S* */,"",$1);
$1=sprintf("%04X",$1);$1=gensub(/^(..)(..)$/, "\\2\\1","g",$1)}
$1="0000"$1"0000"' file

测试一个例子:

kent$  cat f
0 2950|abc|def|0|
0 2564|abc|def|0|
0 7|abc|def|0|

kent$  awk -F'|' -v OFS="|" '{sub(/^\S* */,"",$1);$1=sprintf("%04X",$1);$1=gensub(/^(..)(..)$/, "\\2\\1","g",$1)}$1="0000"$1"0000"' f
0000860B0000|abc|def|0|
0000040A0000|abc|def|0|
000007000000|abc|def|0|

答案 1 :(得分:1)

这可能适合你(GNU sed):

sed -r 'y/|/ /;s/.*/printf "%04X%04X0000|%s|%s|%s|" &/e;s/(..)(..)/\2\1/2' file

答案 2 :(得分:1)

$ cat file
0 2950|abc|def|0|
0 2564|abc|def|0|
0 7|abc|def|0|

Awk Code

awk '{
       gsub(/[[:space:]]/,x,$1)             # Remove Space in field1
       fmt=sprintf("%%0%dd%%s%%0%dd",4,4)   # Format variable for number zeros
       split(sprintf("%04X",$1),A,r)        # Split is used (if gensub not available as its feature of gawk)
       $1=sprintf(fmt,0,A[3]A[4]A[1]A[2],0) # Finally field1 with new values
     }1
    ' FS="|" OFS="|" file

所得

0000860B0000|abc|def|0|
0000040A0000|abc|def|0|  
000007000000|abc|def|0|

您可以更改fmt变量的零数

示例:fmt=sprintf("%%0%dd%%s%%0%dd",1,3) 默认情况下,双方都需要1个零

结果

0860B000|abc|def|0|
0040A000|abc|def|0|
00700000|abc|def|0|

如果您想在Solaris/SunOS系统上尝试此操作,请将awk更改为/usr/xpg4/bin/awk/usr/xpg6/bin/awknawk