簡體   English   中英

在 mawk 中使用 strftime function

[英]Using strftime function in mawk

我正在嘗試創建 AWK 腳本,它將根據某種模式過濾輸入文件,並使用 strftime() function 進行一些計算。

($2 ~ /^[HB]/ && $2 ~ /n$/){
        print strftime("%Y")
}

使用的解釋器是 mawk。 使用此命令觸發此腳本時:

awk -f script3 inputFile

我收到錯誤:“函數 strftime 從未定義”

安裝GAWK會讓你獲得strftime功能,因為你在awk中本身就缺少了這個功能。

使用Ubuntu 11.10或simiar發行版,您可以發出以下命令來獲取GAWK

sudo apt-get install gawk

您也可以使用gawk,但是您不必使用它,並且可以簡單地繼續使用您的原始awk腳本。

嗯,顯然, mawk沒有strftime功能。

我沒有這里的mawk,所以未經測試:

awk -f script -v the_year=$(date "+%Y") inputFile

script有(結合兩個正則表達式:

$2 ~ /^[HB].*n$/ { print the_year }

如果年份應該以某種方式來自$ 0,那么你應該能夠從字符串中解析它。 提供有關您輸入的更多詳細信息。

編輯

輸入由幾行組成,如下所示:“12768 Ashwari F 20 11 1985”。 基本上我必須過濾所有名稱以B或H開頭並以n結尾的名稱。 此外,我必須計算每個過濾學生的年齡,並找出整個組的平均年齡。

awk -v this_year=$(date +%Y) -v today=$(date +%Y%m%d) '
    $2 ~ /^[BH].*n$/ {
        age = this_year - $6
        if (today < $6 $5 $4) { age-- } # I assume those fields are the birthday 
        total_age += age
        count ++
        print $2 " is " age " years old"
    }
    END {
        print "average age = " total_age/count
    }
' inputFile

您可以構建自己的日期實用程序包裝器來提取所有組件。 從那里,你可以隨心所欲地制作它:

echo 123 abc \
 \
 | mawk 'function dateinfo(_,__,___) { 

     ___=RS
         RS="\n"

    (_=(_=substr("gdate",2^(_!~"^[Gg]([Nn][Uu])?$")))\
       " +\47-"(_)"-:%Y:%m:%d:~:%B:~:-weeknum-:%U:"\
     "-julian-:%-j:-dayofweek-:~:%A:%w:-time-:~:%T:"\
     "~:-epochs-:~:%s:"(_~"^g"?"%N":"000000000")":~:"\
                             "-timezone-:~:%z:%Z:~\47") | getline __;
      return \
              \
      printf("%.*s%s",close(_)<"",RS=___,__) 
  } { 
       printf("\n{%s}\n\t{%s}\n\n\t{%s}\n\n",
               $0,dateinfo(),dateinfo("gnu")) }'

{123 abc}
        {-date-:2022:03:30:~:March:~:-weeknum-:13:-julian-:
         89:-dayofweek-:~:Wednesday:3:-time-:~:14:36:04:~:
         -epochs-:~:1648665364:000000000:~:-timezone-:~:-0400:EDT:~}
       
        {-gdate-:2022:03:30:~:March:~:-weeknum-:13:-julian-:
         89:-dayofweek-:~:Wednesday:3:-time-:~:14:36:04:~:
         -epochs-:~:1648665364:208758000:~:-timezone-:~:-0400:EDT:~}

在這里,我還添加了一個功能來自動檢測它是BSD-date還是GNU-date 根據您在系統中的命名方式對其進行相應調整。

這樣你就不需要對 date 進行一堆調用 - 只需調用一次,然后提取你認為合適的組件。

如果你喜歡將單行概念發揮到極致,那么將所有內容都放在 sprintf() 語句中,如下所示:

mawk2 'function usectime(_,__,___) {
                                    \
  return                             \
                                      \
  sprintf("%.0s%.0s%s",(__=substr((RS="\n"substr(\
         _="",_<(___=RS)))"gdate +%s%6N",!_+!_)) | getline _,
         close(__)^(RS=___),_)  

 } $!_=usectime()' <<<'' | lgp3

1648666841181253

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM