我需要詢問 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 ...