使用awk在bash脚本中创建一个“:”分隔列表

时间:2014-02-23 08:06:15

标签: bash awk

我有以下几行

380:<CHECKSUM_VALIDATION>
393:</CHECKSUM_VALIDATION>
437:<CHECKSUM_VALIDATION>
441:</CHECKSUM_VALIDATION>

我需要将其格式化如下

CHECKSUM_VALIDATION:380:393
CHECKSUM_VALIDATION:437:441

是否可以使用“awk”实现上述输出? [我正在使用bash]

谢谢!

4 个答案:

答案 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