Csv

只保留包含確切數量的分隔符的行

  • October 19, 2021

我有一個巨大的 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

但是,這比cuonglmawk解決方案效率低;對於大約 10 個逗號的行,後者在我的系統上通常快 6 倍。更長的線路將導致巨大的減速。

引用自:https://unix.stackexchange.com/questions/255035