【问题标题】:Validating specific column in grep验证 grep 中的特定列
【发布时间】:2020-12-23 18:37:14
【问题描述】:

好吧,这快把我逼疯了。我有一个包含以下内容的文本文件:

"1","2","3","4","text","2020-01-01","2020-12-13","4"
"1","2","3","4","text","2020-12-07","2020-12-03","22"
"1","2","3","4","text","2020-12-12","2020-04-11","21"
"1","2","3","4","text","2020-05-21","2020-03-23","453"

等等

我想过滤 第二个日期 在 12 月的行,我尝试了以下操作:

grep '.*(\d{4}-\d{2}-\d{2}).*(2020-12-).*' > output.txt
grep '.*\d{4}-\d{2}-\d{2}.*2020-12-.*' > output.txt
grep -P '.*\d{4}-\d{2}-\d{2}.*2020-12-.*' > output.txt

但似乎没有任何效果。有什么方法可以使用 grep、egrep、sed 或 awk 完成此任务?

【问题讨论】:

标签: regex sed grep


【解决方案1】:

您需要使用grep-P 选项来启用与perl 兼容的正则表达式,请尝试以下操作。使用您展示的示例进行编写和测试。

grep -P '("\d+",){4}"[a-zA-Z]+","2020-12-\d{2}"' Input_file

说明:以上为补充说明,以下仅作说明之用。

grep             ##Starting grep command from here.
-P               ##Mentioning -P option for enabling PCRE regex with grep.
'("\d+",){4}     ##Looking for " digits " comma this combination 4 times here.
"[a-zA-Z]+",     ##Then looking for " alphabets ", with this one.
"2020-12-\d{2}"  ##Then looking for " 2020-12-07 date " which OP needs.
' Input_file     ##Mentioning Input_file name here.

【讨论】:

  • 或者,如果您只想在文件的第 6 个字段中查找日期 2020-12-07,那么我们也可以简单地为此执行 awk -F'","' '$6=="2020-12-12"' Input_file
  • 请注意,OP 想要 12 月的任何日期。不过,我同意 awk 可能更好,因为这里有不同的列。
  • @KenY-N,当然,感谢您的告知,我现在已经更改了正则表达式,以捕捉 12 月的任何日期。
  • 我试了一下,做了个小改动,如:grep -P '.*"\d{4}-\d{2}-\d{2}","2020-12-\ d{2}"' in.csv > december_2020.csv 忽略第一个日期列...它有效!我猜 -P 有魅力,谢谢!
【解决方案2】:

我建议使用替代解决方案awk,因为输入数据使用通用分隔符按行和列结构化:

awk -F, '$7 ~ /-12-/' file

"1","2","3","4","text","2020-01-01","2020-12-13","4"
"1","2","3","4","text","2020-12-07","2020-12-03","22"

【讨论】:

  • 是的,这个也试过了,它也有效。谢谢。
【解决方案3】:

简写为grep -Pegrep

$ cat test.txt
"1","2","3","4","text","2020-01-01","2020-12-13","4"
"1","2","3","4","text","2020-12-07","2020-12-03","22"
"1","2","3","4","text","2020-12-12","2020-04-11","21"
"1","2","3","4","text","2020-05-21","2020-03-23","453"
$
$ grep -P '^"([^"]*","){6}2020-12-' test.txt
"1","2","3","4","text","2020-01-01","2020-12-13","4"
"1","2","3","4","text","2020-12-07","2020-12-03","22"
$
$ egrep '^"([^"]*","){6}2020-12-' test.txt
"1","2","3","4","text","2020-01-01","2020-12-13","4"
"1","2","3","4","text","2020-12-07","2020-12-03","22"

解释:

  • ^" - 期待 " 开始
  • ([^"]*","){6} - 扫描除" 之外的所有字符,然后是",";重复 6 次
  • 2020-12- - 期待 202012-

【讨论】:

    【解决方案4】:

    问题出在:

    egrep '.*\d{4}-\d{2}-\d{2}.2020-12-.' > output.txt
                              ^ HERE
    

    . 只匹配一个字符,但你想跳过",",所以改为:

    egrep '.*\d{4}-\d{2}-\d{2}.+2020-12-.' > output.txt
                              ^^ HERE
    

    . 变为 .+

    【讨论】:

    • 这绝不是这里唯一的问题。 grep 通常根本不支持 \d,而您正在任何列中寻找匹配项。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-17
    • 2021-09-19
    • 1970-01-01
    • 1970-01-01
    • 2015-07-05
    • 2017-02-05
    相关资源
    最近更新 更多