awkから文字列変数をコピーする

awkから文字列変数をコピーする

各行の前に、その行のスラッシュ数を示す数字を追加したいと思います。

awk '{ l=$0; gsub("[^/]","",l); print length(l),l }' 

l=$0参照として割り当てられているように見えるため、機能しません。串はどうしますかdup

標準のUNIXツールを使用してこれを行うより良い方法はありますか?デフォルトでは、ファイルパスのリストを深さ(スラッシュ数)でソートしたいと思います。

答え1

いいえ。awk常に参照ではなく値として割り当ててください。

これ右スピンドル変数の割り当ては表現するで式はawk常に値を返します。変数をコピーするには、その値を新しい変数に割り当てるだけです。影響元の変数。

存在する:

$ echo 1 | awk '{l=$0; sub("1","2",l); print l, $0}'
2 1

l値のみが変更され、$0値は変更されません。


質問に記載されているとおり、次の操作を行います。

awk -F '/' '{print NF-1, $0}' <file

解析を行う必要はありません。awkスクリプトの本文に到達する前にすべての作業を行います。情報を抽出するだけです。

答え2

マニュアルによると:

gsub(regexp, replacement [, target])

(対象が省略された場合のデフォルト値$0)。gsub()置き換えられた回数を返すので、その場合は数を取得するにはスラッシュを置き換える必要があります。

awk '{l=$0; print gsub("/", ""), l}'

しかし、Etan Reisnerが指摘したように、この場合は割り当ては必要ありません。

awk '{print gsub("/", "/"), $0}'

答え3

代わりに使用してくださいsplit

   split(s, a[, fs ])
             Split the string s into array elements a[1], a[2], ..., a[n],
             and return n.  All elements of the  array  shall  be  deleted
             before  the  split is performed. The separation shall be done
             with the ERE fs or with the field separator FS if fs  is  not
             given. [. . .]

したがって、次の入力ファイルが提供されます。

$ cat file
no slashes
one / slash
two / and /
consecutive 3 ///
none
one /

次のことができます。

$ awk '{ n=split($0,a,"/"); print n-1,$0}' file
0 no slashes
1 one / slash
2 two / and /
3 consecutive 3 ///
0 none
1 one /

関連情報