2011-07-14 13 views
2

個別にシリアル化された多数のPHP配列をファイルに格納しています。ファイルの各行には、シリアライズされた配列が1つ含まれています。例えば:私は、に基づいて求めている行をソートしたいと思い、その後"name"*"*"パターンのためにgrepファイルを作成し、パターンの部分に従って見つかった行を並べ替えることができますか?

は次のパターンのために、このファイルをgrepすることは可能です:ここで

a:2:{s:4:"name";s:8:"John Doe";s:3:"age";s:2:"20";} 
a:2:{s:4:"name";s:8:"Jane Doe";s:3:"age";s:2:"15";} 
a:2:{s:4:"name";s:12:"Steven Tyler";s:3:"age";s:2:"35";} 
a:2:{s:4:"name";s:12:"Jim Morrison";s:3:"age";s:2:"25";} 
a:2:{s:4:"name";s:13:"Apple Paltrow";s:3:"age";s:2:"75";} 
a:2:{s:4:"name";s:12:"Drew Nickels";s:3:"age";s:2:"34";} 
a:2:{s:4:"name";s:11:"Jason Proop";s:3:"age";s:2:"36";} 

は私の質問です2番目のワイルドカードの内容。

+0

私は、コマンドラインからこれをすべて実行しようとしていることを明記する必要があります。 – tambler

+0

最初の行に希望の結果が表示されますか? – Pafjo

+0

理想的には、ファイルの内容と同じ出力を受信したいと思います...パターンにマッチし、2番目のワイルドカードの内容に従ってソートされた行だけです。 – tambler

答えて

3

名前に基づいて行を並べ替える方法は次のとおりです。私はステップを分解して、中間出力を見ることができます。

> cat data.txt 
a:2:{s:4:"name";s:8:"John Doe";s:3:"age";s:2:"20";} 
a:2:{s:4:"name";s:8:"Jane Doe";s:3:"age";s:2:"15";} 
a:2:{s:4:"name";s:12:"Steven Tyler";s:3:"age";s:2:"35";} 
a:2:{s:4:"name";s:12:"Jim Morrison";s:3:"age";s:2:"25";} 
a:2:{s:4:"name";s:13:"Apple Paltrow";s:3:"age";s:2:"75";} 
a:2:{s:4:"name";s:12:"Drew Nickels";s:3:"age";s:2:"34";} 
a:2:{s:4:"name";s:11:"Jason Proop";s:3:"age";s:2:"36";} 

ここで、 'sed'コマンドを使用して、正規表現を使用して名前を抽出します。私たちは、その後、出力名、タブは、その後、元の行は、私たちはそれを並べ替えることができます。

> cat data.txt | sed -rn 's/[^"]+"name";s:[0-9]+:"([^"]+)".*/\1\t\0/p' 
John Doe  a:2:{s:4:"name";s:8:"John Doe";s:3:"age";s:2:"20";} 
Jane Doe  a:2:{s:4:"name";s:8:"Jane Doe";s:3:"age";s:2:"15";} 
Steven Tyler a:2:{s:4:"name";s:12:"Steven Tyler";s:3:"age";s:2:"35";} 
Jim Morrison a:2:{s:4:"name";s:12:"Jim Morrison";s:3:"age";s:2:"25";} 
Apple Paltrow a:2:{s:4:"name";s:13:"Apple Paltrow";s:3:"age";s:2:"75";} 
Drew Nickels a:2:{s:4:"name";s:12:"Drew Nickels";s:3:"age";s:2:"34";} 
Jason Proop  a:2:{s:4:"name";s:11:"Jason Proop";s:3:"age";s:2:"36";} 

このsedコマンドは、行の最初の引用符で囲まれた文字列であることを「名前」値が必要です。おそらくこの手順をPHPスクリプトで実装し、ネイティブPHP関数を使用してデータを逆シリアル化する必要があると保証できない場合は、 'name'が存在しないか、または行に最初に引用された文字列でない場合、その行はスキップされます。 sedの詳細については、オンラインで多くのリソースがあります。私達はちょうどを取り除く必要があり、

> cat data.txt | sed -rn 's/[^"]+"name";s:[0-9]+:"([^"]+)".*/\1\t\0/p' | sort 
Apple Paltrow a:2:{s:4:"name";s:13:"Apple Paltrow";s:3:"age";s:2:"75";} 
Drew Nickels a:2:{s:4:"name";s:12:"Drew Nickels";s:3:"age";s:2:"34";} 
Jane Doe  a:2:{s:4:"name";s:8:"Jane Doe";s:3:"age";s:2:"15";} 
Jason Proop  a:2:{s:4:"name";s:11:"Jason Proop";s:3:"age";s:2:"36";} 
Jim Morrison a:2:{s:4:"name";s:12:"Jim Morrison";s:3:"age";s:2:"25";} 
John Doe  a:2:{s:4:"name";s:8:"John Doe";s:3:"age";s:2:"20";} 
Steven Tyler a:2:{s:4:"name";s:12:"Steven Tyler";s:3:"age";s:2:"35";} 

今、私たちが持っている私たちの行がソート:

今の名前は行の最初であることを、我々は、並べ替え、それらをソートするコマンド通常のUNIXを使用することができます線の前に平らな名前:

> cat data.txt | sed -rn 's/[^"]+"name";s:[0-9]+:"([^"]+)".*/\1\t\0/p' | sort | cut -f2 
a:2:{s:4:"name";s:13:"Apple Paltrow";s:3:"age";s:2:"75";} 
a:2:{s:4:"name";s:12:"Drew Nickels";s:3:"age";s:2:"34";} 
a:2:{s:4:"name";s:8:"Jane Doe";s:3:"age";s:2:"15";} 
a:2:{s:4:"name";s:11:"Jason Proop";s:3:"age";s:2:"36";} 
a:2:{s:4:"name";s:12:"Jim Morrison";s:3:"age";s:2:"25";} 
a:2:{s:4:"name";s:8:"John Doe";s:3:"age";s:2:"20";} 
a:2:{s:4:"name";s:12:"Steven Tyler";s:3:"age";s:2:"35";} 

お楽しみください!

3

すべての行がパターンにマッチするように見えるので、どこにグロッピングが入るのかわかりません。しかし、いずれにせよ、あなたはあなたのサンプル入力をソートするために独自にsortを使用することができます。

sort -t\" -k4 data.txt 
それが迅速かつ汚いですが、それはソートので、それだけで、区切り文字として "の治療のテキストの「本当の」構造を無視しています

あなたはどのようにしたいですか?ここでは、それはアクションである:あなたが"name".*".*"をgrepする必要がある場合

http://ideone.com/ZugIX

、あなただけを行うことができsortコマンドの最初のパイプ出力。

+0

4。5年後に私の夜を救った;) – Shayan

+0

@シャヤンバハルハハはそれを聞いてうれしい!血まみれの地獄、私は本当にここに来たことがありますか? – OpenSauce