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

Shell 如何将文件中的列值转换为十六进制字节翻转格式,shell,sed,awk,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

输入文件:

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字节的字,所以我将附加其余的0,即0000860B0000。希望它能让每个人都明白我的要求。

正如我所评论的,要求不是100%清楚,但是对于你问题中的例子(值正如我所评论的,要求不是100%清楚,但是对于你问题中的例子(值这可能对你有用(GNU-sed):

这可能适用于您(GNU-sed):

Awk代码

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/awk
,或
nawk

Awk代码

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/awk
,或
nawk
FFFF
?例如
2F352
或甚至超过8位:
123456789
?如果是,您将如何进行“翻转”或者该值只是
7
,您将如何翻转它?
0700
?您能否演示如何“转换”和“打印”,这将使您更容易获得帮助。@Thor我删除了您在问题开头添加的文本。因为1)它提供了错误的信息。OP希望转换为十六进制,并翻转。您的示例没有翻转部分。2)到目前为止,
$1
的格式不清楚,可能是
FOO 1234
。我希望你不介意。@Kent:目前来看,如果没有进一步的解释,很难看出
0 2950
如何变成
0000860B
。我添加的文本来自OP的a。也许该文本的修改版本会更好,包括字节交换需求?关于你的第二点,根据前面的问题,转换后的值似乎总是以4个十六进制数字为一组。@Thor哦,我没有注意到他问了一个又一个问题……值是否可以是>
FFFF
?例如
2F352
甚至超过8位:
123456789
?如果是,您将如何进行“翻转”?或者值只是
7
,您将如何翻转它
0700
?您能演示一下如何“转换”和“打印”吗?这样会更容易帮助您。@Thor我删除了您在问题开头添加的文本。因为1)它提供了错误的信息。OP想要转换成十六进制,然后翻转。您的示例没有翻转部分。2) 到目前为止,
$1
的格式尚不清楚,可能是
FOO 1234
。我希望你不介意。@Kent:目前来看,如果没有进一步的解释,很难看出
0 2950
如何变成
0000860B
。我添加的文本来自OP的a。也许该文本的修改版本会更好,包括字节交换需求?关于你的第二点,根据前面的问题,转换后的值似乎总是以4个十六进制数字为一组。@Thor哦,我没有注意到他一个问题一个问题地问。。。
0860B000|abc|def|0|
0040A000|abc|def|0|
00700000|abc|def|0|