使用shell脚本工具过滤文件

时间:2011-11-02 13:29:59

标签: bash unix

我有一个内容为

的文件
E006:Jane:HR:9800:Asst
E005:Bob:HR:5600:Exe
E002:Barney:Purc:2300:PSE
E009:Miffy:Purc:3600:Mngr
E001:Franny:Accts:7670:Mngr
E003:Ostwald:Mrktg:4800:Trainee
E004:Pearl:Accts:1800:SSE
E009:Lala:Mrktg:6566:SE
E018:Popoye:Sales:6400:QAE
E007:Olan:Sales:5800:Asst

我想使用包含管道的命令获取列出所有员工代码在E001和E018之间的员工吗?

4 个答案:

答案 0 :(得分:1)

您可以使用awk来处理此类情况:

$ gawk 'BEGIN { FS=":" } /^E([0-9]+)/ { n=substr($1, 2)+0; if (n >= 6 && n <= 18) { print } }' < data.txt
E006:Jane:HR:9800:Asst
E009:Miffy:Purc:3600:Mngr
E009:Lala:Mrktg:6566:SE
E018:Popoye:Sales:6400:QAE
E007:Olan:Sales:5800:Asst

这是您想要的结果吗?此示例故意仅打印6到18之间的员工,以显示它过滤掉记录。您只能使用$1$2中的print $1 " " $2打印某些字段。

答案 1 :(得分:1)

使用sed:

sed -n -e '/^E001:/,/^E018:/p' data.txt

也就是说,打印那些以E001和E018开头的行之间的行。

如果你想让数字之间的员工在那些之间,那么一种方法就是使用像awk这样的东西进行内联比较(如hochl所建议的那样)。或者,您可以采用此方法前面加sort(如果这些行尚未排序)。

sort data.txt | sed -n -e '/^E001:/,/^E018:/p'

答案 2 :(得分:0)

你可以尝试这样的事情:cut -b2- | awk '{ if ($1 < 18) print "E" $0 }'

答案 3 :(得分:0)

只需进行字符串比较:由于所有样本数据都匹配,我更改了插图的边界

awk -F: '"E004" <= $1 && $1 <= "E009" {print}'

输出

E006:Jane:HR:9800:Asst
E005:Bob:HR:5600:Exe
E009:Miffy:Purc:3600:Mngr
E004:Pearl:Accts:1800:SSE
E009:Lala:Mrktg:6566:SE
E007:Olan:Sales:5800:Asst

如果您不想在awk脚本中对它们进行硬编码,则可以将字符串作为变量传递

awk -F: -v start=E004 -v stop=E009 'start <= $1 && $1 <= stop {print}'