2

awk substr()文字列から部分文字列を抽出するために使用しています。

たとえば、私の文字列が次のようになっているとします。

qwertyuiop

そして、これを使用する (1-3) & (6-9) 文字を抽出したい:

awk '{print (substr($1, 1, 3) substr($1, 6, 4))}'  
qweyui

特定の減算を数回繰り返すにはどうすればよいですか?

たとえば、(1-3) & (6-9)(6-9)(6-9) 文字を抽出して、次のような結果を得たいとします。

qweyuioyuioyuio

もちろん、次のようなコマンドを使用できます。

awk '{print (substr($1, 1, 3) substr($1, 6, 4) substr($1, 6, 4) substr($1, 6, 4))}'

もっと簡単な方法はありますか?

4

4 に答える 4

3

重複しない部分文字列を抽出したい場合は、gawk の固定列幅オプションを使用できます。

echo "qwertyuiop" | gawk -v FIELDWIDTHS="3 2 4" '{ print $1 $3 $3 $3 }'

3 つの列を定義します。最初のものは 3 文字幅です (これは substr($1, 1, 3) と同じです)。2 番目のものは 2 文字幅です (無視します)。3 番目は 2 番目の部分文字列 (substr($1, 6, 4)) です。

定義したフィールドを直接印刷できます。

https://www.gnu.org/software/gawk/manual/gawk.html#Constant-Sizeを参照してください

于 2013-02-11T22:54:44.093 に答える
1

awkで文字列を繰り返すさまざまな方法を説明する楽しい投稿があります。

最も明白なものを引用します:

function rep1(s,n,      r) {
# O(n) allocate/appends
# 2 lines of code
# This is the simplest possible solution that will work:
# just repeatedly append the input string onto the value
# that will be passed back, decrementing the input count
# until it reaches zero.
        while (n-->0) r = r s;
        return r;
}

PS:の関数パラメーターの前に大量のスペースがある場合awkは、このパラメーターが一時ローカル変数として使用されていることを示しています。

于 2013-02-11T18:59:36.467 に答える
1

はい。部分文字列を変数に保存し、必要に応じて再出力するだけです。null を設定することを忘れないでくださいOFS:

awk '{ print substr($1, 1, 3), x = (substr($1, 6, 4)), x, x }' OFS=

テスト:

echo "qwertyuiop" | awk '{ print substr($1, 1, 3), x = (substr($1, 6, 4)), x, x }' OFS=

結果:

qweyuioyuioyuio

3 回または 4 回以上印刷する必要がある場合は、forループを使用する価値があります。

echo "qwertyuiop" | awk '{ for(i=1;i<=5;i++) x = x substr($1, 6, 4); print substr($1, 1, 3), x }' OFS=

結果:

qweyuioyuioyuioyuioyuio
于 2013-02-11T23:33:06.620 に答える
0

これは、このような問題に対する解決策の 1 つです (面倒ですが機能します)。

 echo qwertyuiop | awk '{m=substr($1, 6, 4); {while (count++<3) string=string m; 
 print substr($1, 1, 3) string}}' 

 qweyuioyuioyuio
于 2013-02-11T20:24:18.083 に答える