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

Chevysを除いて、10,000ドル未満のすべての車を表示するリストを作成する必要があります。リストは、最低コストから最高コストの順に並べ替える必要があります。

sedquitオプションと正規表現を使用する必要があります(繰り返しは使用しないでください)

これまでのところ私はこれを持っています

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

繰り返しなしで正規表現に問題があります。

4

3 に答える 3

3

これは宿題ですか?

  • すでにコストの昇順で並べ替えているので、コストが5桁になったら、行の取得を停止する必要があります。
  • sed '/regex$/q'q一致するものがあれば((quit)コマンドのために)停止regex$します。
  • $行末に一致するものがすでにあるので、 regex5つの任意の文字(または、それがより良いと思う場合は数字)を表すものが必要です。
  • その後、車の名前だけを取得し(を参照cut)、重複を削除する(sort -uおよび/またはを参照uniq)には、さらにいくつかのパイプコマンドが必要になります。

コメントへのフォローアップ:

私は今、繰り返しとは、正規表現パターンが繰り返しで構成されたくないことを意味すると仮定してます(つまり[a-z][a-z][a-z])。(最初は、車の名前が重複したくないという意味だと思っていたので、今ではその部分を削除しました。)

あなたはおそらくこれらの構文に興味があるでしょう:

一緒に:

  • ?-ゼロまたは1
  • *-ゼロまたは多数
  • +-1つまたは複数

またあります:

  • {n}-正確n
  • {n,}-nまたはそれ以上。
  • {n,m}-時nを経てm

-rまた、すべてをエスケープする必要がないように、これらを使用するときに指定することもできます。(たとえばsed -r '[a-z]{3}'、とは対照的にsed '[a-z]\{3\}'

egrep構文(を使用)man egrepの詳細については、以下の正規表現を参照してください。sed

于 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

アップデート:

使用する1つの方法は次の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 に答える