繁体   English   中英

按特定列中的一系列值过滤.csv 文件,而不使用 awk 或 sed

[英]Filtering .csv file by a range of values in a specific column WITHOUT using awk or sed

我有一个 csv 文件,其中数据存储如下,空格作为分隔符:

181.221.132.87 2020-03-01T06:22:47.775Z "GET / HTTP/1.1" 200 1 "Mozilla/5.0 (Windows NT 6.1; WOW64; Trident/7.0; rv:11.0) like Gecko"

我必须打印第 5 列(在本例中为值为“1”的列)的值大于 5 的所有行。问题是我在 unix 命令中受到限制,我可以使用并被告知我特别不能使用 awk 或 sed。 提供给我们的命令列表无法完成的任何事情都必须使用自定义 C 程序来实现,但是,重点是尽可能少地使用自定义程序。

Unix commands I can use are as follows: cat curl cut echo exec egrep find grep head ls paste printf sort tail tr uniq wc

抱歉,如果之前有人问过类似的问题,但我找不到不包括 awk 或 sed 的起点

编辑:

{ egrep " "[5-9]{1}" " file.csv; egrep " "[0-9]{2}" "file.csv; }

上面的命令似乎给出了正确的 output,但是我觉得有更好的解决方案。

这就是我想出的!

egrep --color '^(("[^"]*"|[^"]\S*)\s+){4}([1-9][0-9]|[6-9])' file.csv

解释

  • ^是行首

  • ("[^"]*"|[^"]\S*)\s+)是一个单元格,它由两种可能性组成:

    • "[^"]*"这是一个字符串单元格,被引号包围,其正文中不能包含任何引号
    • [^"]\S*)\s+这是一个普通单元格,可以包含除空格以外的任何内容( \s是空格, \S是非空格)
  • {4}对于前 4 个单元格,我们重复 4 次

  • ([1-9][0-9]|[6-9])这是您的号码,再次由 2 种可能性组成:
    • [1-9][0-9]超过 10 个
    • [6-9] 5个以上

至于颜色标志,它...为命令添加颜色,当您在 go 上创建正则表达式时,它可以更轻松地直观地表示匹配的内容:演示

在某些系统上,默认情况下--color存在,因此您可能看不到区别

不带 grep

cat log| while read line
do
  v=`echo $line | cut -d'"' --output-delimiter=' ' -f1,3 | tr -s ' '|cut -f4 -d' ' `
  if [ "$v" -gt 5 ]
  then
    echo $line
  fi                               
done

使用while read line读取文件

split " 与cut odd 是在 " 内没有 " 偶数值的字段

cut -d'"' --output-delimiter=' ' -f1,3

给 181.221.132.87 2020-03-01T06:22:47.775Z 200 1

用 tr 删除双空格

cut -d'"' --output-delimiter=' ' -f1,3 | tr -s ' '

181.221.132.87 2020-03-01T06:22:47.775Z 200 1

通过 cut 在 pos 4 获得场地

cut -d'"' --output-delimiter=' ' -f1,3 | tr -s ' '|cut -f4 -d' '

1

然后在纯 bash [ "$v" -gt 5 ]中检查 5

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM