2014-02-23 31 views
2

在bash脚本分隔的列表,我有以下行创造了“:”用awk

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

我需要把它格式化为以下

CHECKSUM_VALIDATION:380:393 
CHECKSUM_VALIDATION:437:441 

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

谢谢你!

回答

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均匀,然后打印。

+0

太棒了!完美地工作。谢谢Janos! – Hasitha

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 
+0

感谢坐!这工作太... – Hasitha

+0

+1,像这样的做法。 – BMW

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 

基于乔纳斯后,避免getline,这awk应该做的:

awk -F '[:<>/]+' '/<C/ {f=$1;next} { print $2,f,$1}' OFS=\: file 
CHECKSUM_VALIDATION:380:393 
CHECKSUM_VALIDATION:437:441 
1

另一种方式:

awk -F: '/<C/ {printf "CHECKSUM_VALIDATION:%d:",$1; next} {print $1}'