【问题标题】:Remove all non integer row from a csv file with sed/grep使用 sed/grep 从 csv 文件中删除所有非整数行
【发布时间】: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 文件中删除该行。有什么有效的方法可以做到这一点?谢谢。

编辑

我很担心为什么下面提到的解决方案不适用于 sedgrep

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


【解决方案1】:

使用 GNU sed:

sed -n '/^[0-9, -]*$/p' abc.csv

如果您想“就地”编辑文件,请添加 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

【讨论】:

  • 为什么我无法使用它?
【解决方案2】:

使用 grep:

grep -v '[^0-9, -]' abc.CSV

【讨论】:

    【解决方案3】:

    这将打印所有由数字组成的行,以逗号和可选空格分隔;数字前面有一个可选的一元减号。

    $ 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,\}

    【讨论】:

      【解决方案4】:

      另一种使用grep的方法: grep '^[0-9, -]*$' abc.csv

      【讨论】:

        【解决方案5】:

        除了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
        

        注意:要“就地编辑”,您可以使用'-i' 选项。此外,您可以使用'-i.bak' 选项让sed 创建包含原始文件的abc.csv.bak,并在abc.csv 中包含修改后的文件。

        【讨论】:

        • 使用 -i 选项,它会被覆盖为空文件,因为在 sed '/[^0-9, -]/d' abc.csv 之后我没有得到任何 o/p
        • 您使用的是什么操作系统?我在 Linux 上使用完全相同的文件和表达式,它按指示工作。你在 Mac 上吗?
        猜你喜欢
        • 2011-12-15
        • 1970-01-01
        • 1970-01-01
        • 2012-05-25
        • 2023-03-08
        • 2019-12-11
        • 2018-08-25
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多