Csv
只保留包含確切數量的分隔符的行
我有一個巨大的 csv 文件,其中有 10 個欄位,用逗號分隔。不幸的是,有些行格式不正確,並且不包含正好 10 個逗號(當我想將文件讀入 R 時會導致一些問題)。如何僅過濾掉恰好包含 10 個逗號的行?
另一個POSIX:
awk -F , 'NF == 11' <file
如果該行有 10 個逗號,則該行將有 11 個欄位。所以我們只是簡單地
awk
用作,
欄位分隔符。如果欄位數為 11,則條件NF == 11
為真,awk
則執行預設操作print $0
。
使用
egrep
(或grep -E
在 POSIX 中):egrep "^([^,]*,){10}[^,]*$" file.csv
這會過濾掉任何不包含 10 個逗號的內容:它匹配整行(
^
在開頭和$
結尾),恰好包含{10}
序列“除 ‘,’ 之外的任意數量的字元,後跟單個 ‘,’”的十個重複( (([^,]*,)
),後跟除 ‘,’ ([^,]*
) 之外的任意數量的字元。您還可以使用該
-x
參數來刪除錨點:grep -xE "([^,]*,){10}[^,]*" file.csv
但是,這比cuonglm的
awk
解決方案效率低;對於大約 10 個逗號的行,後者在我的系統上通常快 6 倍。更長的線路將導致巨大的減速。