7

私が欲しいのは、現在の行の逆文字列を取得することです。AWK で rev コマンドを使用しようとしましたが、現在の結果を取得できません。

$ cat myfile.txt
abcde

$ cat myfile.txt | awk '{cmd="echo "$0"|rev"; cmd | getline result;  print "result="$result; close(cmd);}'
abcde

edcbaアウトプットしたい。

のように逆の文字列を取得する方法が他にもいくつかあることは知っています$ cat myfile.txt | exec 'rev'。ここで AWK を使用するのは、他に行うべきプロセスがいくつかあるためです。

何か見逃しましたか?

4

5 に答える 5

5

システム関数を使用すると、ユーザーはオペレーティング システム コマンドを実行してから awk プログラムに戻ることができます。system 関数は、string コマンドで指定されたコマンドを実行します。実行されたコマンドによって返されたステータスを値として返します。

$ cat file
abcde

$ rev file
edcba

$ awk '{system("echo "$0"|rev")}' file
edcba

# Or using a 'here string'
$ awk '{system("rev<<<"$0)}' file
edcba

$ awk '{printf "Result: ";system("echo "$0"|rev")}' file
Result: edcba

# Or using a 'here string'
$ awk '{printf "Result: ";system("rev<<<"$0)}' file
Result: edcba
于 2013-03-11T11:32:27.907 に答える
4

これを試して:

awk '{ cmd="rev"; print $0 | cmd; close(cmd) }' myfile.txt

于 2013-11-05T07:05:27.950 に答える
1

awkからコマンドを呼び出すと、rev処理される行ごとにサブプロセスが作成されるため、非常に非効率的です。revawkで関数を定義する必要があると思います。

$ cat myfile.txt | awk 'function rev(str) {
    nstr = ""
    for(i = 1; i <= length(str); i++) {
      nstr = substr(str,i,1) nstr
    }
    return nstr
  }
  {print rev($0)}'
edcba
于 2013-03-11T13:51:45.127 に答える
0

唯一の問題は、印刷ステートメントにあります。使用する

print "result=" result;

(いいえ$result

于 2013-03-11T12:37:34.110 に答える
0

なぜだめですか

awk '{print "result =",$0}' <(rev file)

bashまたは/を使用していない場合ksh93:

rev file | awk '{print "result =",$0}'

---

または、awk が空の FS オプションをサポートしている場合:

awk '{res=x; for(i=NF; i>=1; i--) res=res $i; print res}' FS= file
于 2013-03-11T16:15:31.013 に答える