我想從 CSV 檔案中獲取僅包含數字的行。我的輸入檔如下所示:
8.1.0,289,,,,,,,,,,,,,,,,
9,260,,,,,,,,,,,,,,,,
10,207,,,,,,,,,,,,,,,,
9,206,,,,,,,,,,,,,,,,
Note,8,,,,,,,,,,,,,,,,
10,194,,,,,,,,,,,,,,,,
8.1.0,184,,,,,,,,,,,,,,,,
它應該能夠獲得具有上述格式的數字,例如,9
等。9.0.0
8.1
我如何使用csvgrep
or awk
orsed
命令來實現此目的? 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
應該是安全的。0123456789
0-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
如果在行內至少找到一個字符,則避免列印。