如何從csv檔案中取得只有數字值(沒有英文字母)的行?

如何從csv檔案中取得只有數字值(沒有英文字母)的行?

我想從 CSV 檔案中獲取僅包含數字的行。我的輸入檔如下所示:

8.1.0,289,,,,,,,,,,,,,,,,
9,260,,,,,,,,,,,,,,,,
10,207,,,,,,,,,,,,,,,,
9,206,,,,,,,,,,,,,,,,
Note,8,,,,,,,,,,,,,,,,
10,194,,,,,,,,,,,,,,,,
8.1.0,184,,,,,,,,,,,,,,,,

它應該能夠獲得具有上述格式的數字,例如,9等。9.0.08.1

我如何使用csvgrepor awkorsed命令來實現此目的? CSV 檔案有兩列。它應該省略其中包含任何字母的行。

答案1

使用awk和 驗證所有欄位是否包含有效數字並跳過空白欄位。

awk -F, '{ for(i=1; i<=NF; i++) if($i+0!=$i && $i!="") next }1' infile

答案2

您可以使用該grep命令,如下所示:

grep -v "[A-Za-z]" filename > filename.output

這是測試:

# cat zz2
1;2
a,1
2,B
                                                                                                                   
# grep -v "[A-Za-z]" zz2
1;2

要過濾空行,您可以使用:

grep -v "[A-Za-z]" zz2 | grep -v '^$'

答案3

LC_ALL=C grep -v '[^0123456789,.]' < in.csv > out.csv

將刪除包含 以外的任何字元的行0123456789,.。使用LC_ALL=C,我們確保所有位元組序列形成有效字元。在該語言環境中(但通常不是其他語言環境),替換為C應該是安全的。01234567890-9

對於更嚴格的匹配,要求行是 0 個或多個分隔字段的序列,由0 個或多個 1 個或多個十進制數字的序列的單獨列表,組成,使用 GNU ,您可以執行以下操作:.grep

LC_ALL=C grep -xP '((\d+(\.\d+)*)?)(,(?1))*' < in.csv > out.csv

或 POSIX:

number=[0123456789]+
field="($number(\\.$number)*)?"
LC_ALL=C grep -xE "$field(,$field)*" < in.csv > out.csv

答案4

sed命令d

sed '/[a-zA-Z]/d' data 

如果至少找到一個字符,則刪除所有行。

awk

awk '!/[a-zA-Z]/' data

如果在行內至少找到一個字符,則避免列印。

相關內容