使用 sed/grep 从 csv 文件中删除所有非整数行
Remove all non integer row from a csv file with sed/grep
我试过使用 cat /home/kgh/abc.CSV | awk -F, ' ~ /^[[:digit:]]+$/'
。它正在列级别检查条件。
cat /home/kgh/abc.CSV
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013
1,010116085144,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085149,125,125,124,123,^@000,00,232,28,294522,088,041755,0074,0013
2,010116084424,15954,15593,14034
2,010116084616,15651,15366,12804
预计o/p
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013
2,010116084424,15954,15593,14034
2,010116084616,15651,15366,12804
我无法像 cat /home/kgh/abc.CSV | awk -F, '[=18=] ~ /^[[:digit:]]+$/'
一样在行级别进行检查。我不能将此条件用于其他列,因为它在每个列中包含不同数量的列 row.I 只想检查我的 csv 文件中的数字数据,否则我想从我的 csv file.Is 中删除该行有任何有效这样做的方法?谢谢。
编辑
我担心为什么下面提到的解决方案不适用于 sed
和 grep
太
root@aa:/home/kgh/# cat abc.CSV
1,010116084135,118,115,113,115,-368,09,225,28,294579,077,044677,0074,0013
1,010116084146,000,000,000,000,000,09,227,28,294536,077,044271,0074,0013
1,010116084151,122,121,118,119,-099,05,228,28,294547,077,044150,0074,0013
1,010116084156,121,117,117,116,-244,^@06,228,28,294557,077,044047,0074,0013
root@aa:/home/kgh# sed -n '/^[0-9, -]*$/p' abc.CSV
root@aa:/home/kgh# sed -rn '/^-?[0-9]+(, ?-?[0-9]+)*$/p' abc.CSV
root@aa:/home/kgh# grep -v '[^0-9, -]' abc.CSV
我错过了什么?
已编辑
file abc.CSV
abc.CSV: ASCII text, with CRLF line terminators
我使用 :set list
在 vi 中打开了一个文件以查看 CRLF 行终止符
1,010116084135,118,115,113,115,-368,09,225,28,294579,077,044677,0074,0013$
1,010116084146,000,000,000,000,000,09,227,28,294536,077,044271,0074,0013$
1,010116084151,122,121,118,119,-099,05,228,28,294547,077,044150,0074,0013$
1,010116084156,121,117,117,116,-244,^@06,228,28,294557,077,044047,0074,0013$
因此 sed 或 grep 没有结果。
我已经删除了 CRLF 行终止符,现在可以与 grep 和 sed 一起使用了。
sed 's/'"$(printf '5')"'//g' abc.CSV | sed '/[^0-9, -]/d'
1,010116084135,118,115,113,115,-368,09,225,28,294579,077,044677,0074,0013
1,010116084146,000,000,000,000,000,09,227,28,294536,077,044271,0074,0013
1,010116084151,122,121,118,119,-099,05,228,28,294547,077,044150,0074,0013
使用 GNU sed:
sed -n '/^[0-9, -]*$/p' abc.csv
如果你想编辑你的文件 "in place" 添加 sed 的选项 -i
.
输出:
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013
2,010116084424,15954,15593,14034
2,010116084616,15651,15366,12804
参见:The Stack Overflow Regular Expressions FAQ
这会打印所有由数字组成的行,用逗号和可选的 space 分隔;这些数字前面有一个可选的一元减号。
$ sed -rn '/^-?[0-9]+(, ?-?[0-9]+)*$/p' infile
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013
2,010116084424,15954,15593,14034
2,010116084616,15651,15366,12804
如果没有扩展正则表达式 (-r
),则必须转义括号,?
变为 \{0,1\}
,+
变为 \{1,\}
。
使用 grep:
grep -v '[^0-9, -]' abc.CSV
另一种使用grep的方法:
grep '^[0-9, -]*$' abc.csv
除了sed
print命令外,您还可以使用sed
delete命令删除任何包含 '0-9, -'
以外字符的行。例如:
$sed '/[^0-9, -]/d' abc.csv
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013
2,010116084424,15954,15593,14034
2,010116084616,15651,15366,12804
注:到'edit-in-place',可以使用'-i'
选项。此外,您可以使用 '-i.bak'
选项让 sed
创建 abc.csv.bak
包含原始文件和修改后的文件 abc.csv
.
我试过使用 cat /home/kgh/abc.CSV | awk -F, ' ~ /^[[:digit:]]+$/'
。它正在列级别检查条件。
cat /home/kgh/abc.CSV
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013
1,010116085144,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085149,125,125,124,123,^@000,00,232,28,294522,088,041755,0074,0013
2,010116084424,15954,15593,14034
2,010116084616,15651,15366,12804
预计o/p
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013
2,010116084424,15954,15593,14034
2,010116084616,15651,15366,12804
我无法像 cat /home/kgh/abc.CSV | awk -F, '[=18=] ~ /^[[:digit:]]+$/'
一样在行级别进行检查。我不能将此条件用于其他列,因为它在每个列中包含不同数量的列 row.I 只想检查我的 csv 文件中的数字数据,否则我想从我的 csv file.Is 中删除该行有任何有效这样做的方法?谢谢。
编辑
我担心为什么下面提到的解决方案不适用于 sed
和 grep
太
root@aa:/home/kgh/# cat abc.CSV
1,010116084135,118,115,113,115,-368,09,225,28,294579,077,044677,0074,0013
1,010116084146,000,000,000,000,000,09,227,28,294536,077,044271,0074,0013
1,010116084151,122,121,118,119,-099,05,228,28,294547,077,044150,0074,0013
1,010116084156,121,117,117,116,-244,^@06,228,28,294557,077,044047,0074,0013
root@aa:/home/kgh# sed -n '/^[0-9, -]*$/p' abc.CSV
root@aa:/home/kgh# sed -rn '/^-?[0-9]+(, ?-?[0-9]+)*$/p' abc.CSV
root@aa:/home/kgh# grep -v '[^0-9, -]' abc.CSV
我错过了什么?
已编辑
file abc.CSV
abc.CSV: ASCII text, with CRLF line terminators
我使用 :set list
1,010116084135,118,115,113,115,-368,09,225,28,294579,077,044677,0074,0013$
1,010116084146,000,000,000,000,000,09,227,28,294536,077,044271,0074,0013$
1,010116084151,122,121,118,119,-099,05,228,28,294547,077,044150,0074,0013$
1,010116084156,121,117,117,116,-244,^@06,228,28,294557,077,044047,0074,0013$
因此 sed 或 grep 没有结果。
我已经删除了 CRLF 行终止符,现在可以与 grep 和 sed 一起使用了。
sed 's/'"$(printf '5')"'//g' abc.CSV | sed '/[^0-9, -]/d'
1,010116084135,118,115,113,115,-368,09,225,28,294579,077,044677,0074,0013
1,010116084146,000,000,000,000,000,09,227,28,294536,077,044271,0074,0013
1,010116084151,122,121,118,119,-099,05,228,28,294547,077,044150,0074,0013
使用 GNU sed:
sed -n '/^[0-9, -]*$/p' abc.csv
如果你想编辑你的文件 "in place" 添加 sed 的选项 -i
.
输出:
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013 1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013 2,010116084424,15954,15593,14034 2,010116084616,15651,15366,12804
参见:The Stack Overflow Regular Expressions FAQ
这会打印所有由数字组成的行,用逗号和可选的 space 分隔;这些数字前面有一个可选的一元减号。
$ sed -rn '/^-?[0-9]+(, ?-?[0-9]+)*$/p' infile
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013
2,010116084424,15954,15593,14034
2,010116084616,15651,15366,12804
如果没有扩展正则表达式 (-r
),则必须转义括号,?
变为 \{0,1\}
,+
变为 \{1,\}
。
使用 grep:
grep -v '[^0-9, -]' abc.CSV
另一种使用grep的方法: grep '^[0-9, -]*$' abc.csv
除了sed
print命令外,您还可以使用sed
delete命令删除任何包含 '0-9, -'
以外字符的行。例如:
$sed '/[^0-9, -]/d' abc.csv
1,010116085134,125,125,124,123, 000,00,232,28,294522,077,041755,0074,0013
1,010116085139,125,125,124,123,-012,00,232,28,294522,077,041755,0074,0013
2,010116084424,15954,15593,14034
2,010116084616,15651,15366,12804
注:到'edit-in-place',可以使用'-i'
选项。此外,您可以使用 '-i.bak'
选项让 sed
创建 abc.csv.bak
包含原始文件和修改后的文件 abc.csv
.