0

さて、私はこれを理解することはできません。特定の情報を取得するためにgrepを使用しているファイルのように、このように設定されています。

#aaaa
<numbers 123456>

blah
blah
blah

#bbbb
<numbers 2156488>

blah
blah
blah

#cccc
<numbers 5478624>

blah
blah
blah

私がしているのは、aaaaまたはbbbbまたはccccを探していることです。本当に必要な情報は数字です。取得したいものをgrepするときのようにaaaa、実際にはそのすぐ下の数字だけです。この場合、123456

grepの方法aaaaは知っていますが、次の行に移動して番号をカットする方法がわかりません。

4

6 に答える 6

5

sedの使用:

sed -n '/aaaa/{
N
s/[^0-9]*\([0-9]*\).*/\1/p
}' input_file
于 2012-07-20T15:26:03.130 に答える
4

-Cのオプションを使用して、grep1行のコンテキストを表示できます。次にtail、最後の行(-n 1)で、cutスペースを使用して2番目のフィールドを選択し、cutもう一度>最初のフィールドを使用して選択します。したがって:

$ grep aaaa file -C 1 | tail -n 1 | cut -f2 -d' ' | cut -d'>' -f1
123456

リクエストしている番号が返されます。

最も重要な部分はの-Cオプションですgrep

于 2012-07-20T15:14:10.400 に答える
2

それは私にとっては仕事のように見えsedます:

sed -n '/^#[a-z]\{4\}/{ N; s/#.*\n<numbers //; s/>//p; }'

-n、デフォルトでは印刷されません。;の/^#[a-z]\{4\}/ような行を探します。#aaaa内部のアクションは、{ ... }そのような行にのみ適用されます。手段'次のN行を読む'; 最初s///は番号の前の資料を削除します。2つ目は、末尾>と印刷を削除します。

「無関係な素材を削除する」方法には、1つの代替コマンドなど、他のオプションがありますs/[^0-9]*\([0-9][0-9]+\).*/\1/。これにより、最初の数字列がキャプチャされ、それ以外はすべて削除されます。最初に表示された、より制約された正規表現よりも多くの入力のバリエーションを処理します。

サンプルデータからの出力:

123456
2156488
5478624

これは自動的にの仕事ではありませんsed; 興味深い情報が試合後の3行目になり、それが面倒になるように変更しますsedN;N;N;おそらく、必要なことを実行しますが)。

于 2012-07-20T15:22:34.367 に答える
0

あなたがgrep
+0>"を取り除くことを 主張していない場合

awk 'f{print $2+0; exit} /^#aaaa/{f=1}' foo.txt

または

awk 'f{print $2+0; f=0} /^#aaaa/{f=1}' foo.txt
于 2012-07-20T16:28:36.387 に答える
0

@ Lars Kotthoff

-A 1オプションを使用するというあなたの提案は完璧に機能しました!

あなたの入力を使用した答えはこれです:

grep "aaaa" file -A 1 | grep "<numbers" | cut -d" " -f2 | cut -d">" -f1

私はあなたにこれのクレジットを与えたいです!

于 2012-07-20T15:23:59.087 に答える
0

これを試してください:

for i in "aaaa bbbb"
do
sed -n '/'"$i"'/,+1 p' test |tail -n1|cut -d' ' -f2| sed 's/.$//'
done

それはあまり効率的ではありませんが、うまく機能します。

于 2012-07-20T18:17:42.703 に答える