我有以下几行
380:<CHECKSUM_VALIDATION>
393:</CHECKSUM_VALIDATION>
437:<CHECKSUM_VALIDATION>
441:</CHECKSUM_VALIDATION>
我需要将其格式化如下
CHECKSUM_VALIDATION:380:393
CHECKSUM_VALIDATION:437:441
是否可以使用“awk”实现上述输出? [我正在使用bash]
谢谢!
答案 0 :(得分:2)
您可以尝试此sed
,
sed 'N; s/\([0-9]\+\):<\(.*\)>\n\([0-9]\+\):<\(.*\)>/\2:\1:\3/' file.txt
<强>测试强>
sat:~$ sed 'N; s/\([0-9]\+\):<\(.*\)>\n\([0-9]\+\):<\(.*\)>/\2:\1:\3/' file.txt
CHECKSUM_VALIDATION:380:393
CHECKSUM_VALIDATION:437:441
答案 1 :(得分:2)
你走了:
awk -F '[:<>/]+' '{ n = $1; getline; print $2 ":" n ":" $1 }'
说明:
-F
的字段分隔符设置为:<>/
个字符组合的序列,这样第一个字段就是数字,第二个字段是CHECKSUM_VALIDATION
n
中并阅读下一行(将覆盖$1
)另一种不使用getline
的方法:
awk -F '[:<>/]+' 'NR % 2 { n = $1 } NR % 2 == 0 { print $2 ":" n ":" $1 }'
这个使用记录计数器NR
来确定是否需要打印:如果NR
是奇数,请将n
中的第一个字段保存,如果NR
是偶数,然后打印。
答案 2 :(得分:1)
另一种方式:
awk -F: '/<C/ {printf "CHECKSUM_VALIDATION:%d:",$1; next} {print $1}'
答案 3 :(得分:0)
这是一个gnu awk
awk -F"[:\n<>]" 'NR==1{print $3,$1,$5;f=$3;next} $3{print f,$3,$7}' OFS=":" RS="</CH" file
CHECKSUM_VALIDATION:380:393
CHECKSUM_VALIDATION:437:441
基于Jonas帖子并避免getline
,此awk
应该执行:
awk -F '[:<>/]+' '/<C/ {f=$1;next} { print $2,f,$1}' OFS=\: file
CHECKSUM_VALIDATION:380:393
CHECKSUM_VALIDATION:437:441