2014-03-30 130 views
1

我不確定如何在nawk命令中實現函數調用。我已經給出了範圍,我想從輸入和輸出想要什麼。該函數應驗證第3列並返回true或false。如果列滿足條件,那麼它應該去良好的文件;如果沒有去壞檔案。你能幫我修改nawk命令來實現我的功能嗎?Nawk命令中的函數調用

我知道我們可以在單個語句中實現長度驗證,但我的驗證函數只是示例代碼。我想在驗證函數中實現更多的長度檢查。

input.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 
+0

'awk'真的不能調用外殼的功能,和'長度(以)'是無效殼語法反正。 –

回答

0

首先,你有哪些你想從你的awk腳本中調用一個shell功能。這是行不通的。

如果您的驗證必須在shell中,那麼也許您可以在shell中完成整個任務。

#!/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 

如果你是真的感興趣中是第三場是否大於1000,那麼這將是一個更好的東西來測試比字段的長度。編程的清晰度就像其他任何事物的清晰度。不要混淆,如果你可以避免它..

請注意,我們可以在bash用少一點的代碼來做到這一點,但你的問題只是指定「shell」,所以我假設/bin/sh

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 
+0

我想保持驗證功能nwak命令之外,TEH原因是25行現有的代碼。我需要我的驗證功能,通過把它validate.I只需要nwak命令只有函數調用你能請幫助在那裏面? – Senthil

+0

從awk調用bash函數很尷尬和緩慢。你爲什麼要混合這樣的語言? –

+0

您可以使用bash或ksh,還是僅限於/ bin/sh? –