AWK-変数と関数の結果を変数に追加する


1

AWKに変数と関数の結果を追加したい。入力:

t t t t
a t a ta
ata ta a a

脚本:

{
key="t"
print gsub(key,"")#<-it's work
b=b+gsub(key,"")#<- it's something wrong
}
END{
print b}#<-so this is 0

出力:

4
2
2
0#<-the last print

回答:


2

Brandon Xavierが指摘したように、コードの問題は、gsub単なる一致をカウントしないことです。実際にそれらを置き換えます。したがって、たとえば、

{
    print
    print gsub("t", "")
    print
    print gsub("t", "")
    print
    print "----------"
}

印刷します

t t t t
4

0

----------
a t a ta
2
a  a a
0
a  a a
----------
ata ta a a
2
aa a a a
0
aa a a a
----------

入力データの破損を気にしない場合(つまり、tsをカウントすることだけが必要な場合)、Brandonの提案を使用できます。

{
    x = gsub("t", "")
    print x
    b=b+x
}
END {print b}

おそらく、冗長なgsub呼び出しを排除する限り、上記が最良の答えです。(次のアプローチでは、まだ2つの呼び出しを使用していgsubます。)

新しい変数の追加を避けたい場合は、置換を非破壊的にすることでそれを行うことができます。

{
    key="t"
    print gsub(key, key)
    b=b+gsub(key, key)
}
END {print b}

つまり、tsを自分自身で置き換えます。2番目のを実行しても、それらはそのままですgsub。(それ自体を使用gsub(key, "&")して置き換えることもできkeyます。)

別のアプローチはgsub 、実際の入力行以外のものを最初に変更することです。

{
    temp=$0
    print gsub("t", "", temp)
    b = b + gsub("t", "")
}
END {print b}

「t」を自分自身で置き換えてください-とても簡単です。この解決策を考えなかった理由を説明することはできません。メモとバッシュに戻る必要があります。ありがとうございました。
diego9403

3

gsubは発生をカウントするだけでなく、実際にそれらを置き換えます。そこにある最初のprintステートメント(おそらくデバッグ用)が壊れています。


それで、一致するテキストのみを数える関数がありますか?
diego9403

1
私が知っていることではありません。'{key = "t";のようなことをするだけです。x = gsub(key、 ""); 印刷x; b = b + x; }
ブランドンザビエル

1
@BrandonXavier、正しいコードを答えに入れる必要があります。
グレンジャックマン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.