2016-03-21 8 views
2

大きなテーブルの各フィールドに存在する要素/単語の数を数えようとしています。フィールドは空白で区切られ、フィールド要素(「単語」)はコンマで区切られます。テーブルはまた、空のフィールド(例えば、2つ以上の連続した空白)を含み、これは0個の要素に等しい。awk、出力テーブルの各フィールドの値の数のカウント

val1 3 3 0 1 
val2 0 2 1 1 
val3 0 0 0 2 

(Iは、第1の列を保持したい)

val1 this,is,text this,more,text stop 
val2 this,is a field 
val3 end,text 

これは、所望の出力のようになります。このようなテーブルから例えば

最初の行にstopの値の前に2つの空白があり、4番目のフィールドに0個の要素があることを示します。他の行でも同様のことが起こります。

私は、各フィールドの要素の希望数を持つ配列を作成するためのawkの分割機能を使用してきた:

awk '{ for(i = 2; i <= NF; i++) { 
$i=split($i,a,",") ; { if (!$i) { $i="0" }}; 
}; print $0}' input 

私はn要素の配列aに、各フィールドiを分割しています、この値を変数$iに割り当てます。与えられたフィールドの要素が0の場合、(!$i)、$i=0

しかし、これは私の現在、不要な出力です:

val1 3 3 1 
val2 2 1 1 
val3 2 

あなたが見ることができるように、0の値が省略されています。空のフィールドに0の値を代入することには問題があると思います。

誰でも手伝ってもらえますか?ありがとうございます!

答えて

3

あなたはフィールドセパレータとして単一の空白たいことを指定する必要があります。この場合

awk -F"[ ]" '{str=$1 
       for(i=2; i<=NF; i++){str=str" "split($i, arr, ",")} 
       print str}' test1 

を、出力は次のとおりです。

val1 3 3 0 1 
val2 0 2 1 1 
val3 0 0 0 2 
+0

おはようございます。とても簡単。どうもありがとう! – XGrau

3

のprintf

と本質的に同じ溶液
$ awk -F'[ ]' '{printf "%s ", $1; 
       for(i=2;i<=NF;i++) printf "%s ", split($i,a,","); 
       print ""}' file 

val1 3 3 0 1 
val2 0 2 1 1 
val3 0 0 0 2 
関連する問題