僅當第一行與模式匹配時才使用 Awk 解析文件

僅當第一行與模式匹配時才使用 Awk 解析文件

我需要詢問 CSV 檔案的標題,如果存在列,請繼續處理資料行。上下文是指資料包含列(取決於發出它的時間和內容)。

希望有一個「純粹的」Awk 解決方案來將業務邏輯保持在通用語言中,但如果這是不可能的,則對選擇性地傳遞標頭與 Awk 腳本匹配的文件的方法感興趣。

使用最新版本的 Gawk 始終是一種選擇。

編輯新增偽代碼:

如果標題中的列(NR==1):則繼續處理文件的其餘部分,否則停止處理文件

答案1

列出文件:

嘗試

awk 'FNR == 1 && $4 == "whatever" { print FILENAME ;}' file1 ... filen |

這將選擇具有第四列中的所有內容的所有文件。

如果您有有趣的名字,只需添加引號即可。

awk 'FNR == 1 && $4 == "whatever" { printf "\"s\"\n", FILENAME ;}' file1 ... filen |

處理一個文件

awk 'NR == 1 && $4 != "whatever" { exit ;}  other patterns { other action;}' file

處理許多文件

awk 'NR == 1 && $4 != "whatever" { nextfile ;}  other patterns { other action;}' file1 ... filen

可以理解為

  • IF(條件不滿足)NR == 1 && $4 != "whatever"
  • 然後跳過這個文件{ nextfile ;}
  • 否則繼續other patterns { other action;}

答案2

假設一個簡單的逗號分隔文件,其中每個逗號都是分隔符號(某些csv 文件可能引用了不應被視為字段分隔符號的逗號),當標題中的列為“SOMESTRING”時,以下內容將列印除標題之外的每一行”:

awk -F, '
    FNR==1 {
        for (i=1; i<=NF; i++) 
            if ($i == "SOMESTRING")
                next
        nextfile
    }
    1
' file1 file2 file3 file4

如果合適,可以用子字串測試或正規表示式匹配操作替換字串比較。

nextfile 不是 POSIX AWK 的一部分,但它很普遍;它至少在 gawk、nawk(在 *BSD 系統上使用)、mawk 和 busybox 中可用。

答案3

awk 'FNR==1 && ! /whatever/ { nextfile } ; ...remainder of awk script here...' list_of_files_to_process

這應該跳到下一個要處理的文件,除非「whatever」位於第 1 行。

我不記得是否nextfile是 GNU awk 擴充功能或它是否也可在其他 awks 中使用。手冊mawk頁沒有提到它,但在original-awk.如果這對您很重要,請在依賴該功能之前檢查一下。

如果您使用 GNU awk,您可能需要將該測試放在一個BEGINFILE區塊中,例如:

 BEGINFILE { FNR==1 && ! /whatever/ { nextfile } } ;
 ... remainder of awk script here ...

相關內容