输入文件:
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。希望它能清除每个人的要求。
答案 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/awk
或nawk