2013-07-30 78 views
1

我期待通過文件搜索用awk或sed的,當它遇到一個特定的字母/串之前它插入一個新的生產線。我下面的文件的例子:搜索一個字符串,然後輸入新線

"ABC" "3 0 1 0 1" "ABC" "0 2 0 2 0" 

所以當找到字符串ABC它插入一個新行,以便輸出如下所示:

"ABC" "3 0 1 0 1" 
"ABC" "0 2 0 2 0" 

然後,一旦它已經完成了這一步,我想如果你有GNU awk,那麼這將這樣的伎倆

"ABC" "3 0 1 0 1" "5" 
"ABC" "0 2 0 2 0" "4" 

回答

0

總結在一起,給人這樣的輸出值
BEGIN { 
    FPAT="\"[^\"]+\""     # Describe the field pattern 
} 
{ 
    for (i=1;i<=NF;i+=2) {    # Loop over all the fields 
     n=split($(i+1),x,/[\" ]/)  # Split the numbers fields 
     s = 0       # Variable for the sum of number field 
     for (j=2;j<n;j++) {    # Loop over each number in field 
      s += x[j]     # Summation 
     } 
     print $i,$(i+1),"\""s"\""  # Print field pairs and sum 
    } 
} 

將它保存爲script.awk這樣的文件並運行,如:

$ awk -f script.awk file 
"ABC" "3 0 1 0 1" "5" 
"ABC" "0 2 0 2 0" "4" 
+0

如果我沒有了GNU AWK做?還有其他解決方案嗎? –

+0

你在運行什麼系統? –

+0

我試過你的例子,但它似乎沒有工作我可能有超過5個數字在一行我可以有任何事情達到100 –

0

我會做2張通行證爲簡單:

$ cat file 
"ABC" "3 0 1 0 1" "ABC" "0 2 0 2 0" 

$ awk -v t='"ABC"' '{gsub(" *"t,"\n"t)}1' file | 
    awk -F\" 'NF{split($4,a,/ /); s=0; for (i in a) s+=a[i]; print $0, FS s FS}' 
"ABC" "3 0 1 0 1" "5" 
"ABC" "0 2 0 2 0" "4" 
+1

令人驚訝的解決方案,從你埃德,我沒想到管道'awk'成'awk'將是你的事。 –

+0

是啊,我差點就管道的sed到AWK但不能完全扣動扳機:-)。當清楚地存在記錄但是在原始文件中沒有特定的記錄分隔符時,將輸入分離成記錄是非常簡單的。我的純粹主義者想要在一次awk調用中做出解決方案,但實際上這是我實際做到的方式。 –

相關問題