【发布时间】:2016-01-20 06:21:04
【问题描述】:
我尝试过使用 cat /home/kgh/abc.CSV | awk -F, '$2 ~ /^[[: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\82,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
预期结果
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, '$0 ~ /^[[:digit:]]+$/' 。我不能将此条件用于其他列,因为它在每行中包含不同数量的列。我只想检查我的 csv 文件中的数字数据,否则我想从我的 csv 文件中删除该行。有什么有效的方法可以做到这一点?谢谢。
编辑
我很担心为什么下面提到的解决方案不适用于 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 '\015')"'//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
【问题讨论】:
-
我猜你的 CSV 文件有 DOS 行终止符。使用
dos2unix(或众多替代方案之一;谷歌周围)再试一次,或更新你的正则表达式以允许这个外星人角色。普通的旧grep应该是你所需要的,除非你也想要验证,例如列数,或清除无效数字,如 1.2.3 或 0--0。 -
非常感谢您强调这一点:)
-
您是否仍有问题,或者您是否可以接受其中一个建议的解决方案,从而使这个问题不再以未解决的形式出现?谢谢。
标签: bash file shell csv special-characters