2016-05-09 14 views
-1

これは私の入力ファイルinput.gzです。* NN * NNNNNNNNNNは完全にランダムで不明です。それは0から9の値を有する。一連の数値を参照して文字列を解析する - シェルスクリプト

最後の列の文字列は、次の行に拡張されている。これは単なる例です。文字列は他の行の次の行にも拡張されます。

yyyy-mm-dd hh:mm:ss string *NN*NNNNNNNNNN [AAAAA some random text 
zzzzzzzzzzzz xxxxxxxx yy]  

のは例を見てみましょう:

yyyy-mm-dd hh:mm:ss string *18*6666666666 [AAAAA] 
yyyy-mm-dd hh:mm:ss string *11*2222222222 [AAAAA] 
yyyy-mm-dd hh:mm:ss string *18*6666666666 [AAAAA] 
yyyy-mm-dd hh:mm:ss string *11*2222222222 [AAAAA] 
yyyy-mm-dd hh:mm:ss string *11*2222222222 [AAAAA] 
yyyy-mm-dd hh:mm:ss string *15*9999999999 [AAAAA] 
yyyy-mm-dd hh:mm:ss string *11*2222222222 [AAAAA] 
yyyy-mm-dd hh:mm:ss string *11*2222222222 [AAAAA some random text 
zzzzzzzzzzzz xxxxxxxx yy] 
yyyy-mm-dd hh:mm:ss string *13*7777777777 [AAAAA] 
yyyy-mm-dd hh:mm:ss string *19*5555555555 [AAAAA] 
yyyy-mm-dd hh:mm:ss string *10*4444444444 [AAAAA] 

私はより良い理解のために同じ番号としてすべてのNNNNNNNNNNを取りました。

文字列AAAAAを持つuniq NNNNNNNNNNのみを表示するSEDまたはAWKまたはGREPを使用するスクリプトが必要です。最後のcoloumnには他の文字列もあります。しかし、それは最初の行または次の行にAAAAAを持たなければなりません。

yyyy-mm-ddやhh:mm:ssなどの他のすべての制約は無視してください。考慮すべき唯一の制約は、ある* NN * NNNNNNNNNNAAAAA

の予想される出力は次のようになります。8行目の最後の列があまりにも次の行に拡張されたよう

*11*2222222222 
*10*4444444444 
*19*5555555555 
*18*6666666666 
*13*7777777777 
*15*9999999999 

、私が使用して推測しますAWKは除外されていますか?
このようにスクリプトを正しく実装するにはどうすればよいですか?

grep "\[AAAA"|sed -n '/\*[0-9]*\*[0-9]*/p' 

(これが間違っている場合は、他の方法があまりにも結構です)* NN * NNNNNNNNNNはグレップを使用するか、sedの間、私たちは参照用に任意の値を取ることができない完全にランダムであることを覚えておいてください。

+1

'string'はすべての行で一定の長さですか?また、ラップアラウンドは実際に改行されていますか、それともあなたの端末にそのように表示されますか? –

+0

問題の明確な定義ですが、コードを投稿するのを忘れました。 StackOverflowは、人々がコードを修正する手助けをしています。無料のコーディングサービスではありません。どのコードもコードなしより優れています。 RS値として ']'を使い、 'awk'出力を' sort -u'( 'man sort')にパイプすることを考えてください。がんばろう。 – shellter

+0

@AustinHastingsはい。ストリングusを定数として示す列。実際には複数の列があります。私はちょうど良い理解のためにいくつか投稿した。あなたがAAAAAについて話しているなら、それは一定ではありません。しかし、一連の文字列にはAAAAAが必要です。そして、それは私が推測する新しいラインです(私はワイドスクリーンモニタで端末を拡張し、まだ新しいラインで表示しています)。申し訳ありませんが、私はまだスクリプトの段階を学んでいます。それが新しい行であるかどうかを他の方法で調べる方法はわかりません。 – intruder

答えて

0

あなたが何かのような意味でください:

pattern="AAAAA" 
zcat input.gz \ 
| grep '\['"$pattern"'[] ]' \ 
| sed -e 's/^.*\(\*[0-9*]*\).*$/\1/' \ 
| sort -u 
1

sed + sort -uソリューション:

zcat input.gz | sed -n 's/.* \(\*[0-9]*\*[0-9]*\) \[AAAAA\].*/\1/p' | sort -u 
*10*4444444444 
*11*2222222222 
*13*7777777777 
*15*9999999999 
*18*6666666666 
*19*5555555555 
1

これ、マルチchar型のRS用のGNU AWKを使って、あなたが望むものおそらくです:

$ awk -v RS='][[:blank:]]*\n' '/[^]]*AAAAA[^]]*$/ && !seen[$4]++{print $4}' file 
*18*6666666666 
*11*2222222222 
*15*9999999999 
*13*7777777777 
*19*5555555555 
*10*4444444444 

質問を編集して、より真に代表的なサンプル入力と期待される出力を提供します。たとえば、私はあなたが処理したいかもしれないと思う:

$ cat file 
yyyy-mm-dd hh:mm:ss string *10*2222222222 [AAAAA] 
yyyy-mm-dd hh:mm:ss AAAAA *18*6666666666 [xxxxx] 
yyyy-mm-dd hh:mm:ss string *11*3333333333 [some random text 
AAAAA zzzzzzzzzzzz xxxxxxxx yy] 
yyyy-mm-dd hh:mm:ss string *12*5555555555 [some 
random 
AAAAA text across 
multiple 
lines zzzzzzzzzzzz xxxxxxxx yy] 
yyyy-mm-dd hh:mm:ss string *13*7777777777 [BBBBB] 

として:

$ awk -v RS=']\n' '/[^]]*AAAAA[^]]*$/ && !seen[$4]++{print $4}' file 
*10*2222222222 
*18*6666666666 
*11*3333333333 
*12*5555555555 

ので、あなたが得る他の回答でそれをしよう。

wrtご質問の文As the last column in 8th row is extended to next line too, I guess using AWK is ruled out? - 完全に逆です。 grepとsedは行ベースですが、awkはレコードベースの唯一の標準UNIXツールです。

関連する問題