1. 程式人生 > >awk呼叫函式---內部定義函式和外部shell定義函式

awk呼叫函式---內部定義函式和外部shell定義函式

背景

在處理資料的時候對於一些文字需要做預處理;或者這些文字是通過一系列的處理演變得出;這些都寫在awk中一是程式顯得臃腫混亂,二是耦合性太強。

shell函式

先溫習一下普通shell的寫法

[[email protected] ~]# vim funComm.sh 

#!/bin/bash
#編寫shell function輸出結果可以使用變數進行接收,然後處理
function funComm()
{
    if [ -z "$1" ]
    then
       echo 0 
    else
       echo 1
    fi
}
#編寫shell function使用return可以使用最後退出狀態獲取處理
function funComm2() { if [ -z "$1" ] then return 0 else return 1 fi } funComm2 x if [ $? -eq 1 ] then echo "funcomm2NotNull" else echo "funcomm2Null" fi if [ `funComm2 x` $? -eq 1 ] then echo "funcomm2NotNull" else echo "funcomm2Null" fi if [ `funComm xxx` -eq
1 ] then echo "funCommNotNull" else echo "funCommNull" fi

除錯執行結果如下:

[[email protected] ~]# bash -x funComm.sh 
+ funComm2 x
+ '[' -z x ']'
+ return 1
+ '[' 1 -eq 1 ']'
+ echo funcomm2NotNull
funcomm2NotNull
++ funComm2 x
++ '[' -z x ']'
++ return 1
+ '[' 1 -eq 1 ']'
+ echo funcomm2NotNull
funcomm2NotNull
++ funComm xxx
++ '['
-z xxx ']' ++ echo 1 + '[' 1 -eq 1 ']' + echo funCommNotNull funCommNotNull

以上的普通函式包含幾個知識點
1、函式定義格式
2、比較的用法
3、函式呼叫方法
4、分支控制
可以參考shell基礎

awk呼叫內部定義函式

在部落格GNU awk介紹中已經有示例我直接拿過來用 GNU awk示例連線

[[email protected] ~]# awk 'function fun(a,b){return a+b}BEGIN{print fun(1,2)}' 
3

這是awk呼叫自己內部定義的函式

awk呼叫外部定義函式

awk中如果需要呼叫shell函式需要將函式export為系統引數,然後呼叫的時候用system;

[[email protected] ~]# cat funComm.sh 
#!/bin/bash
function funComm()
{
    if [ -z "$1" ]
    then
       echo 0 
    else
       echo 1
    fi
}
function funComm2()
{
    if [ -z "$1" ]
    then
       return 0 
    else
       return 1
    fi
}
funComm2 x
if [ $? -eq 1 ]
then
echo "funcomm2NotNull"
else
echo "funcomm2Null"
fi

if [ `funComm2 x` $? -eq 1 ]
then
echo "funcomm2NotNull"
else
echo "funcomm2Null"
fi
if [ `funComm xxx` -eq 1 ]
then
    echo "funCommNotNull"
else
    echo "funCommNull"       
fi
export -f funComm
awk 'BEGIN{
    printf "awk call shell function: "
    _value=system("funComm x")
    if(_value == "0")
    {
        print "awk funComm not null"
    }
    else
    {
        print "awk funComm null" 
    }  
}'
exit

除錯執行結果如下:

[[email protected] ~]# bash -x funComm.sh 
+ funComm2 x
+ '[' -z x ']'
+ return 1
+ '[' 1 -eq 1 ']'
+ echo funcomm2NotNull
funcomm2NotNull
++ funComm2 x
++ '[' -z x ']'
++ return 1
+ '[' 1 -eq 1 ']'
+ echo funcomm2NotNull
funcomm2NotNull
++ funComm xxx
++ '[' -z xxx ']'
++ echo 1
+ '[' 1 -eq 1 ']'
+ echo funCommNotNull
funCommNotNull
+ export -f funComm
+ awk 'BEGIN{
    printf "awk call shell function: "
    _value=system("funComm x")
    if(_value == "0")
    {
        print "awk funComm not null"
    }
    else
    {
        print "awk funComm null" 
    }  
}'
awk call shell function: 1
awk funComm not null
+ exit

原文連線

相關推薦

awk呼叫函式---內部定義函式外部shell定義函式

背景 在處理資料的時候對於一些文字需要做預處理;或者這些文字是通過一系列的處理演變得出;這些都寫在awk中一是程式顯得臃腫混亂,二是耦合性太強。 shell函式 先溫習一下普通shell的寫法 [[email protected] ~]

js建構函式裡的方法prototype上定義方法的區別

建構函式裡的方法 function Fun1(arg) { this.arg = arg; this.test = function(){ return this.arg; } } 函式內的方法相當於是函式的私有變數,如果新建立的物件需要使用裡面的私有

定義數字字串的轉換函式

C語言中,常見的字串與數字之間的相互轉換的庫函式有:atof(字串轉換成浮點數)、atoi(字串轉換成整型數)、atol(字串轉換成長整形數)、itoa(整型數轉換成字串)、ltoa(長整型數轉換成字串)等。在求職中,讓求職者自定義此類函式的實現是為了考察求職者

android獲取手機內部儲存空間外部儲存空間

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

java8新特性[2]:內部迭代外部迭代(Internal vs external iteration)

Java8 增加了新的語言特性(例如 lambda 表示式和預設方法),為此 Java8 的類庫也進行了很多改進,例如從外部迭代到內部迭代的改變。 集合類庫主要依賴於外部迭代(external iteration)。Collection 實現 Iterable 介面,從而使得使用者可以依次遍歷集

hive中管理表(內部表)外部表的區別是什麼,及分割槽表使用場景

⑴區別: ①Hive建立內部表時(預設建立內部表),會將資料移動到資料倉庫指向的路徑;建立外部表(需要加關鍵字external),僅記錄資料所在的路徑,不對資料的位置做任何改變; ⑵Hive刪除表時,內部表的元資料和資料會被一起刪除,而外部表只刪除元資料,不刪除資料;

STM32使用內部晶振外部晶振

在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法如果使用內部RC振盪器而不使用外部晶振,請按照下面方法處理:1)對於100腳或144腳的產品,OSC_IN應接地,OSC_OUT應懸空。2)對於少於100腳的產品,有2種接法:2.1)OSC_IN和OSC_

非阻塞賦值的內部延時外部延時

學習verilog有一段時間了,從字面上理解,阻塞和非阻塞的區別很直白。 前者是序列,主要用於描述組合邏輯,和軟體中的賦值類似;後者是並行,主要用於描述時序邏輯。 但是和內部延時、外部延時混用在一起的時候,各種意想不到的情況就會發生。 下面將介紹,對於非阻塞賦值,內部延遲和

STM32使用內部振盪器及其外部晶體振盪器的區別

在STM32上如果不使用外部晶振,OSC_IN和OSC_OUT的接法如果使用內部RC振盪器而不使用外部晶振,請按照下面方法處理:1)對於100腳或144腳的產品,OSC_IN應接地,OSC_OUT應懸空。2)對於少於100腳的產品,有2種接法:2.1)OSC_IN和OSC_O

內部跳轉外部跳轉的區別,底層實現原理

他們的區別是: response.sendRedirect是向客戶瀏覽器傳送頁面重定向指令,瀏覽器接收後將向web伺服器重新發送頁面請求,所以執行完後瀏覽器的url顯示的是跳轉後的頁面。跳轉頁面可以是一個任意的url(本伺服器的和其他伺服器的均可)。 RequestDispatcher.forward則是直接

const、static、內部連結屬性外部連結屬性整理

開發十年,就只剩下這套架構體系了! >>>   

動態語言、靜態語言、強型別定義語言弱型別定義語言區別

呵~~(冷笑) 第一次接觸pythod,是一個朋友告知我它是一種弱型別語言,不用規定變數型別,於是”python=弱型別“ 的概念在我腦海紮根,並且深信不疑!! 然後每每和別人談起pythod時,我就會以資深口吻”哦,pythod啊,它是一種弱型別語言“開頭~~

java中定義常量C#中定義常量的區別

一、常量定義的基本注意事項。   在Java語言中,主要是利用final關鍵字()來定義常量。當常量被設定後,一般情況下就不允許再進行更改。如可以利用如下的形式來定義一個常量:final double PI=3.1315。在定義這個常量時,需要注意如下內容:   一是常

vue全域性自定義指令區域性自定義指令

除了預設設定的核心指令 (v-model 和 v-show),Vue 也允許註冊自定義指令。 區域性自定義指令(只針對元件內的元素) 父元件app.vue <template> <div id="app">

C++中帶有預設引數的宣告定義。Qt中重寫預設建構函式。C++中函式呼叫時實參個數函式定義時的形參個數不一致時的處理。

1、Qt中自動生成的建構函式 (1)Qt中自動生成的建構函式的宣告 class Chat : public QWidget { Q_OBJECT public: explicit Chat(QWidget *parent = 0); //宣告建構函式,可以帶有初始值“=0”

php中函式內部呼叫外部變數

php函式在使用外部變數的幾種情況。 外部用global定義 函式內使用$GLOBALS陣列引用 global $mytext; $mytext="外部使用global定義"; function test(){ echo $GLOBALS['

shell 指令碼-函式定義呼叫

fun() { echo I am function } # invoking function fun fun2() { echo I am functionii2 echo haha } #呼叫函式 X=`fun2` echo $X fun3() { echo

JS怎樣在外部呼叫函式內部函式

宣告一個全域性變數,在函式內部給函式賦值給該變數,然後在外部通過變數呼叫。 var outVal = 'jack'; // 宣告一個變數,稍後呼叫 var later; function outer() { var innerVal = 'sam'; function inner

定義平面中的一個Circle類, 1編寫一個無引數建構函式, 2編寫一個有參的建構函式 3在主函式呼叫無參建構函式生成圓的例項c1,呼叫有參建構函式生成圓的例項c2,呼叫例項方法判斷c1c2是否重

定義平面中的一個Circle類, 1編寫一個無引數建構函式, 2編寫一個有參的建構函式 3在主函式中呼叫無參建構函式生成圓的例項c1,呼叫有參建構函式生成圓的例項c2,呼叫例項方法判斷c1和c2是否重疊 class Point { double x; double y

awk呼叫shell命令與getlinesystem函式

total14 -rw-r--r-- 1 Administrator None 2 Mar 3 20:20 4 -rw-r--r-- 1 Administrator None 0 Feb 28 19:49 4]] -rw-r--r-- 1 Administrator None 87 Mar 5 20:22 a