2014-02-23 34 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}'