我需要创建一个linux脚本来搜索文件中的行格式如下:
文本:文本:文本:文本:号码:号码
所以6个文本/数字字符串除以5分号
例如:
2f0d:011a0000:07f8:0002:1:0
我想将分号视为列分隔符
e.g。
Column1:Column2:Column3:Column4:Column5:Column6
然后我想像这样重新排列数据:
Column1:Column3:Column4:Column2 discarding column5 & column6
例如:
2f0d:07f8:0002:011a0000
然后我想用下划线替换分号,从每列中删除前导零&转换为UPERCASE
例如:
2F0D_7F8_2_11A0000
最终结果
在file1中,这样的条目
2f0d:011a0000:07f8:0002:1:0
E4+1
p:BSkyB,C:0000
将转换为:
2F0D_7F8_2_11A0000
E4+1
p:BSkyB,C:0000
另请注意,file1
中的这3个行条目中有100个,如果不是1000个答案 0 :(得分:4)
kent$ awk -F: -v OFS="_" 'NF==6{for(i=1;i<=4;i++){sub(/^0*/,"",$i);$i=toupper($i)};print $1,$3,$4,$2;next}7' file
2F0D_7F8_2_11A0000
E4+1
p:BSkyB,C:0000
你可能想知道,在awk中:
这个命令比上面的单行更重要:
man gawk
答案 1 :(得分:1)
使用sed的解决方案:
sed -r 's/^0*([a-f0-9]+):0*([a-f0-9]+):0*([a-f0-9]+):0*([a-f0-9]+):[a-f0-9]+:[a-f0-9]+$/\1_\3_\4_\2/'
请参阅DEMO
答案 2 :(得分:1)
使用sed:
sed -r 's/^0*([[:alnum:]]+):0*([[:alnum:]]+):0*([[:alnum:]]+):0*([[:alnum:]]+):0*([[:digit:]]+):0*([[:digit:]]+)$/\U\1_\3_\4_\2/' foo