Grep 格雷普得到的数字在一个范围内

Grep 格雷普得到的数字在一个范围内,grep,Grep,我试图在csv文件的第12列中显示包含范围为20-200的数字的行。但是,我没有得到正确的输入 我试过这个: grep -E "^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([2-9][0-9]|1[0-9][0-9]|200)" file.csv > sc1_d.csv 我做错了什么? 有什么想法吗?保持简单,只需使用awk: awk -F, '(20 <= $12) &

我试图在csv文件的第12列中显示包含范围为20-200的数字的行。但是,我没有得到正确的输入

我试过这个:

grep -E "^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([2-9][0-9]|1[0-9][0-9]|200)" file.csv > sc1_d.csv
我做错了什么?
有什么想法吗?

保持简单,只需使用awk:

awk -F, '(20 <= $12) && ($12 <= 200)' file

awk-F'(20这里有两个问题

(1) 查找第12列的方法在任何包含逗号的单元格的行中都不起作用。除非您知道是谁编写了CSV文件,否则很难解决此问题。由于没有单一的CSV规范,CSV文件中有多种转义逗号和引号的方法。例如,在一个规范中,单元格中的逗号用反斜杠转义(例如,我的医生的名字可能写为
。在另一种情况下,任何包含逗号的单元格值都需要放在双引号中,双引号本身需要写为两个双引号(因此,
“Dr.Bob,MD”

但是,如果出于某种原因,您碰巧知道在CSV文件中单元格值中嵌入逗号不是问题,您可以忽略这一点

(2) 该表达式还允许一些您不需要的其他值,例如201或20000B。因此,如果您知道这不是最后一列,您可以在选项后添加逗号:

([2-9][0-9]|1[0-9][0-9]|200),
如果你不能做出这样的假设,那么你可以只找一个逗号或行尾:

([2-9][0-9]|1[0-9][0-9]|200)(,|$)
最后,您可以使用“repeat”来精确指定
[^,]*,
模式的11个实例

grep -E "^([^,]*,){11}([2-9][0-9]|1[0-9][0-9]|200)(,|$)" file.csv > sc1_d.csv

虽然
grep
是一种从文本中选择部分的工具,但它仅基于字符串操作,不了解数字范围或其他高级概念。为此,最好使用其他工具,如
awk
。Ed Morton的回答很好地说明了如何以可读性很强的方式完成任务。@Mert我明白了您尚未接受任何问题的答案,请阅读。