Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

awk 經典慣用語解析:`awk '{$2=$5=\"\"}1' file` 到底在做什麼?

編輯:Linux 教學

命令拆解

awk '{$2=$5=\"\"}1' file
片段含義
{$2=$5=\"\"}動作:將第 2、5 欄設為空字串(實際保留分隔符,輸出時會出現連續空欄)
1模式:常數 1 為真,觸發預設動作 {print $0}(列印整行)

awk 執行模型

awk 'pattern {action}' file
# 等價於
while (getline > 0) {
    if (pattern) action
}
  • 省略 pattern → 對每行執行 action。
  • 省略 action → 預設 {print $0}。
  • pattern 為非零常數/變數/表達式結果 → 視為真。

為何寫 1 而非 print?

1 是最短的「真」模式,觸發預設列印。常見變體:

  • awk '1' file ≡ cat file
  • awk 'NF' file → 僅列印非空行(NF=欄位數)
  • awk '/regex/' file → 列印匹配行

實際效果示範

輸入:

a b c d e f
1 2 3 4 5 6

命令:awk '{$2=$5=\"\"}1' file

輸出:

a  c d  f
1  3 4  6

第 2、5 欄變空,但分隔符(預設空白)保留,視覺上欄位「消失」。若需真正刪除欄位需重組 $0 或使用 cut。

進階技巧:真正刪除第 2、5 欄

# 方法 1:重組 $0(依賴 OFS)
awk '{$2=$5=\"\"; $1=$1}1' file

# 方法 2:用輸出分隔符控制
awk -v OFS=, '{$2=$5=\"\"; print}' file

# 方法 3:切片重組(最穩健)
awk '{for(i=1;i<=NF;i++) if(i!=2 && i!=5) printf \"%s%s\", $i, (i==NF?ORS:OFS)}' file

總結

awk '1' 是「列印所有行」的極簡慣用語;配合 {...} 修改欄位後再用 1 觸發列印,是單行腳本常見模式。理解 pattern-action 模型,能寫出更簡潔高效的 awk 程式。

Copyright © Windows教程網 All Rights Reserved