0

我有这样的事情:

plym    fury    77      73      2500
chevy   nova    79      60      3000
ford    mustang 65      45      10000
volvo   gl      78      102     9850
ford    ltd     83      15      10500
chevy   nova    80      50      3500
fiat    600     65      115     450
honda   accord  81      30      6000
ford    thundbd 84      10      17000
toyota  tercel  82      180     750
chevy   impala  65      85      1550
ford    bronco  83      25      9500

我需要创建一个列表,列出所有价格低于 10,000 美元的汽车,雪佛兰除外。该列表应从最低成本到最高排序。

我必须使用sed退出选项和正则表达式(不要使用重复)

到目前为止我有这个

grep -iv "chevy" cars | sort -nk 5 | sed '/regex$/ q'

我在没有重复的情况下遇到了正则表达式的问题。

4

3 回答 3

3

这是作业吗?

  • 由于您已经按成本升序排序,因此您只需要在成本变为五位数时停止抓取行。
  • sed '/regex$/q'当任何匹配时都会停止(因为q( quit ) 命令) 。regex$
  • 你已经有了一个$匹配行尾的地方,所以你只需要一个regex代表五个任意字符(或数字,如果你认为这样更好)的东西。
  • 之后,您将需要更多管道命令来获取汽车名称(请参阅cut)并删除重复项(请参阅sort -u和/或uniq

跟进评论:

我现在假设通过重复,您的意思是不希望您的正则表达式模式包含重复(即[a-z][a-z][a-z])。(我最初以为您的意思是您不想要重复的汽车名称,所以我现在已经删除了那部分。)

您可能会对这些语法感兴趣:

随着:

  • ?- 零或一
  • *- 零个或多个
  • +- 一个或多个

还有:

  • {n}- 准确的n时间
  • {n,}-n或更多次。
  • {n,m}-nm次。

您可能还想-r在使用这些时指定,这样您就不必逃避所有事情。(例如sed -r '[a-z]{3}',与sed '[a-z]\{3\}'.

有关egrep 语法(使用)的更多信息,请参阅下面的正则表达式。man egrepsed

于 2012-10-12T03:02:25.803 回答
2

您可以更简单地使用GNU awk

awk '!/chevy/ && $NF < 10000 { print | "sort -nk 5" }' file.txt

结果:

fiat    600     65      115     450
toyota  tercel  82      180     750
plym    fury    77      73      2500
honda   accord  81      30      6000
ford    bronco  83      25      9500
volvo   gl      78      102     9850

更新:

这是一种使用方法GNU sed

< file.txt sort -nk 5 | sed -nre '/chevy/d' -e '/.* [0-9]{,4}$/p'

结果:

fiat    600     65      115     450
toyota  tercel  82      180     750
plym    fury    77      73      2500
honda   accord  81      30      6000
ford    bronco  83      25      9500
volvo   gl      78      102     9850
于 2012-10-12T01:50:55.737 回答
1

awkGNU sort:_

awk '!/chevy/{if($5 < 10000){print}}' file.txt | sort -n -k 5

输出

fiat    600     65      115     450
toyota  tercel  82      180     750
plym    fury    77      73      2500
honda   accord  81      30      6000
ford    bronco  83      25      9500
volvo   gl      78      102     9850

sed不是为制作算术表达式而设计的。有些人尝试过Sed 替换可能涉及算术?


另一个使用, 在&Perl上测试过的解决方案(非常便携)MinixArchlinux

perl -lane '
    END{for (sort {$a<=>$b} keys %h) {print $h{$_}}}
    $h{$F[-1] . " " . $F[1]} = join "\t", @F
        if $F[-1] < 10000 && $F[1] ne "chevy"
' file.txt
于 2012-10-12T01:45:56.147 回答