2016-05-17 4 views
1

私は次の形式を持つファイルを持っている:ファイルの行から数値パターンを抽出

70337262003 
70337262003 
71375201001 
71375201001 
10722963407 
55173006602 
60404822801 

EDouble entry for scenario XX AAA 70337262003 Line 000000003350 
EDouble entry for scenario XX AAA 70337262003 Line 000000003347 
EDouble entry for scenario XX AAA 71375201001 Line 000000003353 
EDouble entry for scenario XX AAA 71375201001 Line 000000003351 
EDouble entry (different date/time) for scenario YY AAA 10722963407 Line 000000000447 
EDouble entry for scenario YY AAA 55173006602 Line 000000002868 
EDouble entry (different date/time) for scenario YY AAA 60404822801 Line 000000003285 

私は何をしたいすべてのアルファベット文字と出力含むファイルを剥ぎ、基本的です

私は準備ができていないので、そこに着くのを助けることができるいくつかのアイデアを列挙しました。私はすべてのアルファベット文字を削除できます。

tr -d '[[:alpha:]]' 

が、それはまだ私が二から最初の数を分離するために、さらにファイルを処理する必要がありますを意味します。二番目の数字はいつものパターンを見つけるために、0

sed -n 's/.*\[1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1-9][1- 9]\).*/\1/p' 

で始まり、そして唯一の印刷パターン–ますので、sedのはおそらく簡単な解決策を提供することができますが、上記のコマンドは何も出力しません。誰かが私を助けてくれますか?これをsedで行う必要はありません。私はgsubでawkを想像し、grepは何か類似していますか?

+0

[1-9]という誤植があり、[0-9]を使用する必要があるからです。 – POW

答えて

1

grepを使用すると、これを行うことができます。

grep -o '[1-9][0-9]\{10\}' file 

sedのでは:0から始まる番号など

sed -n 's/.*\([1-9][0-9]\{10\}\).*/\1/p' file 

11桁をターゲットに、エラーの狭い余裕がありますが、12桁の長さです。その事実を考慮し、より堅牢なソリューションは次のようになります。

sed -n 's/.*[[:blank:]]\([1-9][0-9]\{10\}\).*/\1/p' file 

は、すなわち番号の前[[:blank:]]と一致することを確認してください。

+0

申し訳ありませんが、[1-9]と10 * [0-9]の構文が一致し、一致するものだけが表示されますか? – onlyf

+0

@onlyf:yes .... – Jahid

1

AAAは、数字の後ろのすべての行で一定です。

そこであなたはこれを使用することができます。

$ grep -oP '(?<=AAA\s)\s*\d+' data 
70337262003 
70337262003 
71375201001 
71375201001 
10722963407 
55173006602 
60404822801 
2

プリント第三の最後の列に:

awk '{print $(NF-2)}' file 

出力:この1つは単語に続く数字のグループを抽出

 
70337262003 
70337262003 
71375201001 
71375201001 
10722963407 
55173006602 
60404822801 
1

境界の後には行末が続きません。

$ grep -Po '\d+\b(?!$)' infile 
70337262003 
70337262003 
71375201001 
71375201001 
10722963407 
55173006602 
60404822801 
  • -P
  • -oのみ一致
  • \d+\bは貪欲ワード境界
  • (?!$)続く数字と一致する保持Perlの正規表現を可能にし、「負の先読み」です:次の文字がある場合行末が一致しない
2

だから、あなたがsedを好むなら、これを使ってください:

sed -rn "[email protected]*([1-9][0-9]{10}).*@\[email protected]" file.txt 
+0

すべての行が印刷されるので、代わりに 'sed -r 's ///''( 'p'なし)を使うこともできます。そして二重引用符はなぜですか?ここでは関係ありませんが、意図しないパラメータ拡張で問題が発生する可能性があります。しかし、+1のためにsed :) –

関連する問題