精通awk系列(14):細說awk中的變數和變數賦值

来源:https://www.cnblogs.com/f-ck-need-u/archive/2019/12/08/12005588.html
-Advertisement-
Play Games

回到: "Linux系列文章" "Shell系列文章" "Awk系列文章" awk變數 awk的變數是動態變數,在使用時聲明。 所以awk變數有3種狀態: 未聲明狀態:稱為untyped類型 引用過但未賦值狀態:unassigned類型 已賦值狀態 引用未賦值的變數,其預設初始值為空字元串或數值0 ...



回到:


awk變數

awk的變數是動態變數,在使用時聲明。

所以awk變數有3種狀態:

  • 未聲明狀態:稱為untyped類型
  • 引用過但未賦值狀態:unassigned類型
  • 已賦值狀態

引用未賦值的變數,其預設初始值為空字元串或數值0

在awk中未聲明的變數稱為untyped,聲明瞭但未賦值(只要引用了就聲明瞭)的變數其類型為unassigned。

gawk 4.2版提供了typeof()函數,可以測試變數的數據類型,包括測試變數是否聲明。

awk 'BEGIN{
  print(typeof(a))            # untyped
  if(b==0){print(typeof(b))}  # unassigned
}'

除了typeof(),還可以使用下麵的技巧進行檢測:

awk 'BEGIN{
  if(a=="" && a==0){    # 未賦值時,兩個都true
    print "untyped or unassigned"
  } else {
      print "assigned"
  }
}'

變數賦值

awk中的變數賦值語句也可以看作是一個有返回值的表達式。

例如,a=3賦值完成後返回3,同時變數a也被設置為3。

基於這個特點,有兩點用法:

  • 可以x=y=z=5,等價於z=5 y=5 x=5
  • 可以將賦值語句放在任意允許使用表達式的地方
    • x != (y = 1)
    • awk 'BEGIN{print (a=4);print a}'

問題:a=1;arr[a+=2] = (a=a+6)是怎麼賦值的,對應元素結果等於?arr[3]=7。但不要這麼做,因為不同awk的賦值語句左右兩邊的評估順序有可能不同。

awk中聲明變數的位置

  1. 在BEGIN或main或END代碼段中直接引用或賦值
  2. 使用-v var=val選項,可定義多個,必須放在awk代碼的前面
    • 它的變數聲明早於BEGIN塊
    • 普通變數:awk -v age=123 'BEGIN{print age}'
    • 使用shell變數賦值:awk -v age=$age 'BEGIN{print age}'
  3. 在awk代碼後面使用var=val參數
    • 它的變數聲明在BEGIN之後
    • awk '{print n}' n=3 a.txt n=4 b.txt
    • awk '{print $1}' FS=' ' a.txt FS=":" /etc/passwd
    • 使用Shell變數賦值:awk '{print age}' age=$age a.txt

awk中使用Shell變數

要在awk中使用Shell變數,有三種方式:

1.在-v選項中將Shell變數賦值給awk變數

num=$(cat a.txt | wc -l)
awk -v n=$num 'BEGIN{print n}'

-v選項是在awk工作流程的第一階段解析的,所以-v選項聲明的變數在BEGIN{}、END{}和main代碼段中都能直接使用。

3.直接在awk代碼部分暴露Shell變數,交給Shell解析進行Shell的變數替換

num=$(cat a.txt | wc -l)
awk 'BEGIN{print '"$num"'}'

這種方式最靈活,但可讀性最差,可能會出現大量的引號。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 相關模塊 1. AbpAspNetCoreModule 2. AbpAspNetCoreMvcModule 3. AbpAspNetCoreMvcContractsModule abp通過這三個模塊載入並配置了 asp.net core。,最主要的就是AbpAspNetCoreMvcModule模塊 ...
  • 原文:https://blogs.msdn.microsoft.com/mazhou/2017/06/06/c-7-series-part-3-default-literals/ C#的default關鍵字有兩種用法:一種是標記switch…case結構的預設分支(會匹配任意不被所有case條件匹配 ...
  • 安裝Docker CentOS 7 安裝 Docker 編寫Dockerfile 右鍵項目-》添加-》Docker 支持 選擇Linux 修改為如下: FROM mcr.microsoft.com/dotnet/core/aspnet:2.2-stretch-slim AS base WORKDIR ...
  • 知識需要不斷積累、總結和沉澱,思考和寫作是成長的催化劑 梯子 一、鎖1、lock2、Interlocked3、Monitor4、SpinLock5、Mutex6、Semaphore7、Events1、AutoResetEvent2、ManualResetEvent3、ManualResetEvent ...
  • 大家好,這幾天試著從Github上拉取AspNetCore的源碼,嘗試著通過Visual Studio 打開,但是並不盡人意。我們需要去構建我們拉去的源代碼,這樣才可以通過VisualStudio可還原的項目。畢竟AspNetCore是一個巨型的項目集。 先決條件 在Windows中構建AspNet ...
  • HttpReports 簡單介紹 HttpReports 是 .Net Core下的一個Web組件,適用於 WebAPI 項目和 API 網關項目,通過中間件的形式集成到您的項目中, 通過HttpReports,可以讓開發人員快速的搭建出一個 API 性能分析的基礎報表網站。 主要包含 HttpRe ...
  • 在前幾篇里痞子衡介紹的Boot Device都屬於主動啟動的Master Boot Device(Serial(Multi-IO) NOR, SD/eMMC),試想一下如果遇到這樣的情況,你選擇啟動的某個Master Boot Device正常工作一段時間後某次開機突然因為某種未知原因無法啟動了,此... ...
  • 回到: "Linux系列文章" "Shell系列文章" "Awk系列文章" gawk支持的正則 . 匹配任意字元,包括換行符 ^ $ [...] [^...] | + ? () {m} {m,} {m,n} {,n} [:lower:] [:upper:] [:alpha:] [:digit:] [ ...
一周排行
    -Advertisement-
    Play Games
  • 1. 說明 /* Performs operations on System.String instances that contain file or directory path information. These operations are performed in a cross-pla ...
  • 視頻地址:【WebApi+Vue3從0到1搭建《許可權管理系統》系列視頻:搭建JWT系統鑒權-嗶哩嗶哩】 https://b23.tv/R6cOcDO qq群:801913255 一、在appsettings.json中設置鑒權屬性 /*jwt鑒權*/ "JwtSetting": { "Issuer" ...
  • 引言 集成測試可在包含應用支持基礎結構(如資料庫、文件系統和網路)的級別上確保應用組件功能正常。 ASP.NET Core 通過將單元測試框架與測試 Web 主機和記憶體中測試伺服器結合使用來支持集成測試。 簡介 集成測試與單元測試相比,能夠在更廣泛的級別上評估應用的組件,確認多個組件一起工作以生成預 ...
  • 在.NET Emit編程中,我們探討了運算操作指令的重要性和應用。這些指令包括各種數學運算、位操作和比較操作,能夠在動態生成的代碼中實現對數據的處理和操作。通過這些指令,開發人員可以靈活地進行算術運算、邏輯運算和比較操作,從而實現各種複雜的演算法和邏輯......本篇之後,將進入第七部分:實戰項目 ...
  • 前言 多表頭表格是一個常見的業務需求,然而WPF中卻沒有預設實現這個功能,得益於WPF強大的控制項模板設計,我們可以通過修改控制項模板的方式自己實現它。 一、需求分析 下圖為一個典型的統計表格,統計1-12月的數據。 此時我們有一個需求,需要將月份按季度劃分,以便能夠直觀地看到季度統計數據,以下為該需求 ...
  • 如何將 ASP.NET Core MVC 項目的視圖分離到另一個項目 在當下這個年代 SPA 已是主流,人們早已忘記了 MVC 以及 Razor 的故事。但是在某些場景下 SSR 還是有意想不到效果。比如某些靜態頁面,比如追求首屏載入速度的時候。最近在項目中回歸傳統效果還是不錯。 有的時候我們希望將 ...
  • System.AggregateException: 發生一個或多個錯誤。 > Microsoft.WebTools.Shared.Exceptions.WebToolsException: 生成失敗。檢查輸出視窗瞭解更多詳細信息。 內部異常堆棧跟蹤的結尾 > (內部異常 #0) Microsoft ...
  • 引言 在上一章節我們實戰了在Asp.Net Core中的項目實戰,這一章節講解一下如何測試Asp.Net Core的中間件。 TestServer 還記得我們在集成測試中提供的TestServer嗎? TestServer 是由 Microsoft.AspNetCore.TestHost 包提供的。 ...
  • 在發現結果為真的WHEN子句時,CASE表達式的真假值判斷會終止,剩餘的WHEN子句會被忽略: CASE WHEN col_1 IN ('a', 'b') THEN '第一' WHEN col_1 IN ('a') THEN '第二' ELSE '其他' END 註意: 統一各分支返回的數據類型. ...
  • 在C#編程世界中,語法的精妙之處往往體現在那些看似微小卻極具影響力的符號與結構之中。其中,“_ =” 這一組合突然出現還真不知道什麼意思。本文將深入剖析“_ =” 的含義、工作原理及其在實際編程中的廣泛應用,揭示其作為C#語法奇兵的重要角色。 一、下劃線 _:神秘的棄元符號 下劃線 _ 在C#中並非 ...