1

nawkコマンドで関数呼び出しを実行する方法がわかりません。入力と出力から必要なものをスコープに与えました。関数は列 3 を検証し、true または false を返す必要があります。列が条件を満たす場合は、適切なファイルに移動する必要があります。そうでない場合は、不良ファイルに移動します。nawk私の機能を実現するためにコマンドを変更するのを手伝ってもらえますか?

長さの検証を 1 つのステートメントで実行できることはわかっていますが、検証関数は単なるサンプル コードです。検証機能で長さチェックをさらに実現したい。

入力.txt :

1 | I | 123  | KK
3 | U | 3456 | JJ
6 | B | 241  | YH

outputgood.txt :

3 | U | 3456 | JJ

outputbad.txt :

1 | I | 123  | KK
6 | B | 241  | YH

脚本:

#!/bin/sh
#function validation

function validate(){
in = $1
if length(in) > 3
  return true
else
 return false
}

nawk -F '|' 'function validate($3){print}' input.txt > outputgood.txt
4

2 に答える 2

1

それが読み取りデータの場合、パイプで分割すると、フィールドの値に空白が残ります。また、nawk 関数は実際には nawk スクリプトの本体にある必要があります。

これを試してみましょう:

nawk -F'[[:space:]]*\\\|[[:space:]]*' '
    function validate(in) {
        return (length(in) > 3)
    }
    {
        if (validate($3)) {
            print > "good"
        } else {
            print > "bad"
        }
    }
' input.txt

はるかに簡単です:

nawk -F '|' '{if ($3 > 1000) print > "good"; else print > "bad"}' input.txt
于 2014-03-30T19:07:25.340 に答える
0

まず、awk スクリプト内から呼び出そうとするシェル関数があります。それはうまくいきません。

検証をシェルで行う必要がある場合は、おそらくすべてをシェルで行うことができます。

#!/bin/sh

while read line; do

  var=${line#* | }                              # take off first field
  var=${var#* | }                               # take off second field
  var=${var% | *}                               # take off fourth field
  var=`expr "$var" : "^\ *\(.*[^ ]\)\ *$"`      # trim whitespace

  if [ ${#var} -gt 3 ]; then
    echo "$line" >> outputgood.txt
  else
    echo "$line" >> outputbad.txt
  fi

done < input.txt

$IFS可変量の空白を使用できないため、パラメーター ツールを使用して行を分割しています。代わりに、位置パラメータを使用してこれを行うこともできます。これにより、他のフィールドへのアクセスが容易になる可能性があります。フィールドの長さを条件として使用している場合は、まだトリムする必要があることに注意してください。

#!/bin/sh

IFS="|"
while read line; do

  set -- $line
  var=`expr "$3" : "^\ *\(.*[^ ]\)\ *$"`        # trim whitespace

  if [ ${#var} -gt 3 ]; then
    echo "$line" >> outputgood.txt
  else
    echo "$line" >> outputbad.txt
  fi

done < input.txt

本当に関心があるのが 3 番目のフィールドが 1000 より大きいかどうかである場合は、フィールドの長さよりもそれをテストする方がよいでしょう。プログラミングの明快さは、他のことの明快さと同じです。難読化を回避できる場合は、難読化しないでください。

の少し少ないコードでこれを行うことができますbashが、あなたの質問は「シェル」を指定しただけなので、/bin/sh.

于 2014-03-30T20:01:53.903 に答える