AWK 入門教程:強大的文本處理工具

AWK 是一種強大的文本處理工具,廣泛用于 Linux/Unix 系統中對文本文件或數據流進行操作。它能夠基于條件篩選、統計字段、重新排列數據等。主要特點包括:

2. AWK 的基本語法

2.1 AWK 程序的結構

AWK 程序的結構:

awk?'pattern?{?action?}'?file

2.2 常用內置變量

變量含義
NR當前處理的行號
FNR當前文件的行號(處理多個文件時的相對行號)
NF當前行的字段數(列數)
2第 1 列、第 2 列的值
$NF當前行的最后一列值
FS輸入字段分隔符(默認為空格)
OFS輸出字段分隔符(默認空格)
RS輸入記錄分隔符(默認為換行符)
ORS輸出記錄分隔符(默認為換行符)
ARGIND當前處理的文件在命令行參數中的索引
ARGC命令行參數的數量
ENVIRON存儲當前環境變量的關聯數組
FILENAME當前正在處理的文件名
SUBSEP數組下標分隔符(默認為?\034
RSTARTmatch?函數匹配字符串的起始位置
RLENGTHmatch?函數匹配字符串的長度

以下是?常用內置變量?的補充說明,以 Markdown 格式輸出:

變量說明:
2.3 運行 AWK 程序

AWK 程序可以通過以下方式運行:

注意事項

  • ? 未指定文件時,AWK 從標準輸入讀取數據;

  • ? 可同時處理多個文件;

2.4 基本輸出

2.5 高級輸出

printf 格式化輸出

printf?可以格式化輸出內容,例如:

awk?'{?printf?"Name:?%s,?Age:?%d\n",?$1,?$2?}'?file.txt
排序輸出

結合?sort?命令對輸出進行排序:

awk?'{?print?$1?}'?file.txt?|?sort

2.6 選擇/過濾行

按某列的值
按某幾列值的計算結果
按字符串匹配
不同方式的組合
BEGIN 和 END

2.7 計算

統計數量:工時超過 15 小時的員工人數
awk?'$3?>?15?{?count++?}?END?{?print?count?}'?file.txt
求和、求平均:平均工資
awk?'{?sum?+=?$2?}?END?{?print?"Average:",?sum/NR?}'?file.txt
處理文本:打印時薪最高的員工信息
awk?'$4?>?max?{?max?=?$4;?line?=?$0?}?END?{?print?line?}'?file.txt
字符串拼接(concatenation):在一行內打印所有員工名
awk?'{?names?=?names?$1?"?"?}?END?{?print?names?}'?file.txt
打印最后一行
awk?'{?last?=?$0?}?END?{?print?last?}'?file.txt
內置函數

2.8 控制流

If-Else
awk?'{?if?($1?>?50)?print?"High";?else?print?"Low"?}'?file.txt
While
awk?'{?i?=?1;?while?(i?<=?NF)?{?print?$i;?i++?}?}'?file.txt
For
awk?'{?for?(i?=?1;?i?<=?NF;?i++)?print?$i?}'?file.txt

2.9 數組

統計每列的總和:
awk?'{?for?(i?=?1;?i?<=?NF;?i++)?sum[i]?+=?$i?}?END?{?for?(i?in?sum)?print?"Column",?i,?"Sum:",?sum[i]?}'?file.txt

3. AWK 示例速查表

以下是常見 AWK 功能及其對應程序和類似命令:

編號功能AWK 程序類似命令
1打印總行數END { print NR }wc -l
2打印第 10 行NR == 10 { print }sed -n '10p'
3打印最后一列{ print $NF }
4打印最后一行的最后一列{ f = $NF } END { print f }tail -n1
5打印有 4 列以上的行NF > 4 { print }
6打印最后一列的值大于 4 的行$NF > 4 { print }
7打印所有輸入的總字段數{ nf += NF } END { print nf }
8打印包含關鍵字的總行數/keyword/ { n++ } END { print n }grep -c 'keyword'
9打印第 1 列的最大值及對應的行$1 > max { max = $1; line = $0 } END { print max, line }
10打印列數大于 1 的行NF > 1 { print }
11打印長度大于 80 的行length($0) > 80 { print }
12打印每行的列數和該行內容{ print NF, $0 }
13打印第 2 列和第 1 列{ print $2, $1 }
14交換第 1 列和第 2 列{ t = $1; $1 = $2; $2 = t; print }
15第 1 列替換為行號{ $1 = NR; print }
16刪除第 2 列并打印{ $2 = ""; print }
17倒序打印每行的字段{ for (i=NF; i>0; i--) printf "%s ", $i; printf "\n" }
18計算每行的字段和{ sum=0; for (i=1; i<=NF; i++) sum += $i; print sum }
19計算所有字段的總和{ for (i=1; i<=NF; i++) sum += $i } END { print sum }
20將所有字段取絕對值并打印{ for (i=1; i<=NF; i++) if ($i<0) $i = -$i; print }
    • ??基于模式匹配:?根據條件篩選數據。

    • ??列操作能力:?簡單高效地處理文本列數據。

    • ??輕量編程語言:?提供內置變量、循環、條件語句等編程功能。

    • 相關資料

      《AWK 編程語言》:

    • https://github.com/wuzhouhui/awk/blob/twoside/The_AWK_Programming_Language_zh_CN.pdf

    • ??pattern:?指定操作的匹配規則,例如正則表達式、邏輯判斷等。

    • ??action:?指滿足條件時要執行的操作,用?{}?包圍,例如打印、統計、替換等。

    • ??file:?要處理的文本文件名稱。

    1. NR 和 FNR 的區別

      • ??NR:累計行號,處理多個文件時行號會累加。

      • ??FNR:當前文件的行號,處理多個文件時每個文件的行號從 1 開始重新計數。

    2. FS 和 OFS 的作用

      • ??FS:指定輸入字段的分隔符,默認是空格。

      • ??OFS:指定輸出字段的分隔符,默認是空格。

    3. RS 和 ORS 的作用

      • ??RS:指定輸入記錄的分隔符,默認是換行符。

      • ??ORS:指定輸出記錄的分隔符,默認是換行符。

    4. ?ENVIRON 的使用

      • ??ENVIRON?是一個關聯數組,用于訪問環境變量。例如:

        awk?'BEGIN?{?print?ENVIRON["HOME"]?}'
    5. RSTART 和 RLENGTH

      • ? 這兩個變量與?match?函數配合使用,用于獲取匹配字符串的起始位置和長度。例如:

        awk?'BEGIN?{?str?=?"hello?world";?match(str,?/world/);?print?RSTART,?RLENGTH?}'
    6. SUBSEP

      • ? 用于多維數組的下標分隔符,默認是?\034(非打印字符)。例如:

        awk?'BEGIN?{?arr["a",?"b"]?=?10;?print?arr["a",?"b"]?}'
    7. ARGIND 和 ARGC

      • ??ARGIND:當前處理的文件在命令行參數中的索引(從 1 開始)。

      • ??ARGC:命令行參數的數量。例如:

        awk?'BEGIN?{?print?ARGIND,?ARGC?}'?file1.txt?file2.txt
    8. FILENAME

      • ? 當前正在處理的文件名。例如:

        awk?'{?print?FILENAME,?$0?}'?file1.txt?file2.txt
    9. 2, ..., $NF

      • ??$1?表示第 1 列,$2?表示第 2 列,依此類推。

      • ??$NF?表示當前行的最后一列。

    10. NF

      • ? 當前行的字段數(列數)。例如:

        awk?'{?print?NF?}'?file.txt
    11. RS 和 ORS 的高級用法

      • ? 可以修改?RS?和?ORS?來處理非標準格式的文件。例如,將?RS?設置為空字符串,以處理多行記錄:

        awk?'BEGIN?{?RS?=?""?}?{?print?$0?}'?file.txt
    12. SUBSEP 的高級用法

      • ? 可以修改?SUBSEP?來定義多維數組的下標分隔符。例如:

        awk?'BEGIN?{?SUBSEP?=?":";?arr["a",?"b"]?=?10;?print?arr["a",?"b"]?}'
    13. RSTART 和 RLENGTH 的高級用法

      • ? 結合?match?函數,可以提取匹配的子字符串。例如:

        awk?'BEGIN?{?str?=?"hello?world";?match(str,?/world/);?print?substr(str,?RSTART,?RLENGTH)?}'
    14. ENVIRON 的高級用法

      • ? 可以遍歷?ENVIRON?數組,打印所有環境變量。例如:

        awk?'BEGIN?{?for?(key?in?ENVIRON)?print?key,?ENVIRON[key]?}'
    15. ?FILENAME 的高級用法

      • ? 在處理多個文件時,可以根據文件名執行不同的操作。例如:

        awk?'{?if?(FILENAME?==?"file1.txt")?print?"File1:",?$0;?else?print?"File2:",?$0?}'?file1.txt?file2.txt
    1. 命令行直接運行

      awk?'pattern?{?action?}'?file
      • ??pattern:匹配條件(可選)。

      • ??action:滿足條件時執行的操作。

      • ??file:要處理的文件。

    2. 腳本文件運行

      awk?-f?script.awk?file

      示例:假設?script.awk?內容如下:

      {?print?$1?}

      運行命令:

      awk?-f?script.awk?file.txt
      • ??script.awk:包含 AWK 程序的腳本文件。

      • ??file:要處理的文件。

    • ? 打印文件的所有內容:

      awk?'{?print?$0?}'?file.txt
    • ? 打印文件的第 1 列和第 3 列:

      awk?'{?print?$1,?$3?}'?file.txt
    • ? 打印第 2 列大于 50 的行:

      awk?'$2?>?50?{?print?}'?file.txt
    • ? 打印第 1 列和第 2 列之和大于 100 的行:

      awk?'$1?+?$2?>?100?{?print?}'?file.txt
    • ? 打印包含 "error" 的行:

      awk?'/error/?{?print?}'?file.txt
    • ? 打印第 2 列大于 50 且包含 "error" 的行:

      awk?'$2?>?50?&&?/error/?{?print?}'?file.txt
    • ??BEGIN?塊在處理輸入前執行,END?塊在處理輸入后執行:

      awk?'BEGIN?{?print?"Start"?}?{?print?}?END?{?print?"End"?}'?file.txt
    • ? 統計行數、單詞數、字符數:

      awk?'{?chars?+=?length($0);?words?+=?NF?}?END?{?print?"Lines:",?NR,?"Words:",?words,?"Chars:",?chars?}'?file.txt

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/73241.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/73241.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/73241.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql select distinct 和 group by 哪個效率高

在有索引的情況下&#xff0c;SELECT DISTINCT和GROUP BY的效率相同&#xff1b;在沒有索引的情況下&#xff0c;SELECT DISTINCT的效率高于GROUP BY?。這是因為SELECT DISTINCT和GROUP BY都會進行分組操作&#xff0c;但GROUP BY可能會進行排序&#xff0c;觸發filesort&…

使用conda將python環境打包,移植到另一個linux服務器項目中

問題&#xff1a;因為新的服務器A不能聯網&#xff0c;導致離線pip install包耗時耗力&#xff0c;舊的服務器B中的Anaconda和A中是同一個版本&#xff0c;有現成的python環境&#xff0c;并且服務器B可以聯網&#xff0c;現想將B中的環境&#xff0c;直接移植到A中使用。 解決…

晶晨S905M/晶晨S905L2芯片-原機安卓4升級安卓7.1.2-通刷線刷固件包

晶晨S905M&#xff0f;晶晨S905L2芯片-原機安卓4升級安卓7.1.2-通刷線刷固件包 線刷方法&#xff1a;&#xff08;新手參考借鑒一下&#xff09; 1、準備好一根雙公頭USB線刷刷機線&#xff0c;長度30-50CM長度最佳&#xff0c;同時準備一臺電腦&#xff1b; 2、電腦上安裝好…

KICK第四講Linux 系統下安裝 GCC 編譯器全指南

Linux 系統下安裝 GCC 編譯器全指南 GCC&#xff08;GNU Compiler Collection&#xff09;是 Linux 系統下最常用的編譯器之一&#xff0c;支持 C/C、Java 等多種編程語言。本文將介紹不同 Linux 發行版下的安裝方法&#xff0c;幫助開發者快速配置開發環境。 一、使用包管理…

Django系列教程(8)——函數視圖及通用類視圖

目錄 什么是視圖(View)及其工作原理 接近現實的函數視圖 更復雜的案例: 視圖處理用戶提交的數據 基于函數的視圖和基于類的視圖 Django通用類視圖 a. ListView b. DetailView c. CreateView d. UpdateView e. FormView f. DeleteView 小結 Django的視圖(view)是處理…

c# 查找相似顏色算法

下是一個基于歐幾里得距離的C#顏色相似度查找算法實現,包含詳細注釋和優化策略: using System; using System.Collections.Generic;public class ColorMatcher {// 顏色容器 - 使用字典存儲顏色ID到RGB的映射private readonly Dictionary<int, byte[]> _colorDictiona…

【A2DP】藍牙音頻編解碼器互操作性要求詳解

目錄 一、音頻編解碼器互操作性&#xff1a;核心要點總覽 二、必選與可選編解碼器互操作性要求大盤點 2.1 必選與可選的編解碼器支持 2.2 必選編解碼器要求 2.3 可選編解碼器要求 2.4 廠商自定義&#xff08;Vendor Specific&#xff09;A2DP編解碼器互操作性要求 2.5 不…

electron 設置跨域iframe

在 Electron 的主進程中禁用同源策略 在 Electron 的主進程文件中添加 app.commandLine.appendSwitch("disable-site-isolation-trials"); 來禁用站點隔離試驗。在創建 BrowserWindow 時&#xff0c;設置 webPreferences 的 webSecurity: false 來禁用同源策略。

c-線程創建,同步互斥,互斥鎖;

文章目錄 案例描述1代碼實現代碼解釋 案例背景2代碼實現代碼解析關鍵概念總結擴展練習 案例描述1 我們將模擬一個簡單的售票系統&#xff0c;其中有兩個售票窗口同時出售100張票。為了確保不會賣出超過100張票&#xff0c;并且不會出現賣票時的競態條件&#xff08;race condi…

SpringBoot第二天

目錄 1.Web開發 1.1簡介 1.2SpringBoot對靜態資源的映射規則 1.3模板引擎 1.3.1引入thymeleaf&#xff1b; 1.3.2Thymeleaf語法 1.3.2.1標準表達式語法 1.變量表達式 1.3.2.2表達式支持的語法 1.3.2.3常用的thymeleaf標簽 1.4Springboot整合springmvc 1.4.1Springmvc…

Redis的緩存雪崩、緩存擊穿、緩存穿透與緩存預熱、緩存降級

一、緩存雪崩&#xff1a; 1、什么是緩存雪崩&#xff1a; 如果緩在某一個時刻出現大規模的key失效&#xff0c;那么就會導致大量的請求打在了數據庫上面&#xff0c;導致數據庫壓力巨大&#xff0c;如果在高并發的情況下&#xff0c;可能瞬間就會導致數據庫宕機。這時候如果…

Html5記憶翻牌游戲開發經驗分享

H5記憶翻牌游戲開發經驗分享 這里寫目錄標題 H5記憶翻牌游戲開發經驗分享前言項目概述技術要點解析1. 頁面布局&#xff08;HTML CSS&#xff09;響應式設計 2. 翻牌動畫效果3. 游戲邏輯實現狀態管理卡片配對檢測 開發技巧總結1. 模塊化設計2. 性能優化3. 用戶體驗 踩坑經驗擴…

【開源+代碼解讀】Search-R1:基于強化學習的檢索增強大語言模型框架3小時即可打造個人AI-search

大語言模型(LLMs)在處理復雜推理和實時信息檢索時面臨兩大挑戰:知識局限性(無法獲取最新外部知識)和檢索靈活性不足(傳統方法依賴固定檢索流程)。現有方法如檢索增強生成(RAG)和工具調用(Tool-Use)存在以下問題: RAG:單輪檢索導致上下文不足,無法適應多輪交互場景…

Linux網絡套接字編程——創建并綁定

目錄 網絡字節序 socket編程接口 socket bind 如果將進程比作一個房子&#xff0c;那套接字相當于是一扇門&#xff0c;通向與外界通信的通道。 在網絡中&#xff0c;如何理解套接字呢&#xff0c;時刻記住套接字是為了標識互聯網中的某一臺主機上的某一個進程&#xff0c…

1720. 解碼異或后的數組

解碼異或后的數組 題目描述嘗試做法 題目描述 未知整數數組 arr 由 n 個非負整數組成。 經編碼后變為長度為 n - 1 的另一個整數數組 encoded &#xff0c;其中 encoded[i] arr[i] XOR arr[i 1] 。例如&#xff0c;arr [1,0,2,1] 經編碼后得到 encoded [1,2,3] 。 給你編…

了解一下HTTP的短連接和長連接

在 HTTP 協議中&#xff0c;連接的方式主要分為長連接和短連接。這兩種連接方式的主要區別在于連接的生命周期和數據傳輸的效率。理解它們的差異對于優化 Web 應用的性能和資源利用至關重要。以下是 HTTP 長連接和短連接的詳細解釋。 1. 短連接&#xff08;HTTP/1.0&#xff0…

【WRF模擬】如何查看 WPS 的輸入靜態地理數據(二進制格式)?

查看 WPS 的輸入靜態地理數據方法總結 方法 1:使用 gdal_translate 將二進制數據轉換為 GeoTIFFgdal_translate 工具概述使用 gdal_translate 將二進制數據轉換為 GeoTIFF方法 2:使用 ncdump 查看 geo_em.dXX.nc方法 3:使用 Python xarray + matplotlib 可視化 geo_em.dXX.n…

Mybatis語法bug

select * from appointment where status ‘ACCEPTED’ and expire_time< now() idea顯示now&#xff08;&#xff09;這里一直報錯&#xff1a; 應為標記名稱 應為 Deepseek: 根據您的代碼和報錯信息分析&#xff0c;這是一個 MyBatis XML 文件中的 SQL 語法問題。具體原…

DeepSeek本機部署(基于Ollama和Docker管理)

目錄 一、ollama 與 docker 簡介 &#xff08;一&#xff09;ollama(Ollama) &#xff08;二&#xff09;docker 二、利用 ollama 和 docker 配置 deepseek-r1 的準備工作 &#xff08;一&#xff09;硬件需求 &#xff08;二&#xff09;軟件安裝 三、配置 deepseek-r1…

小程序 wxml 語法 —— 39 簡單雙向數據綁定

在 WXML 中&#xff0c;普通屬性的綁定是單向的&#xff0c;比如 <input value"{{ value }}" />&#xff0c;當數據發生改變時&#xff0c;頁面也會隨之發生變化&#xff0c;但是當用戶在輸入框中輸入最新內容&#xff0c;最新內容并不會同步給 value 數據&…