2016-05-20 5 views
1

私は回帰テスト/再生ツールの一部として使用している1600万行のデータファイルを持っています。データには似たような行がたくさんあります。私は、ファイルを16万行と2の4番目の要素を持つ行、3、または10である特定の条件を満たしている行のうち、大部分を除外します

ファイル形式で

|DATA|DATA|DATE|3|DATA|DATA 
|DATA|DATA|DATE|3|DATA|DATA 
|DATA|DATA|DATE|3|DATA|DATA 
|DATA|DATA|DATE|2|DATA|DATA 
|DATA|DATA|DATE|4|DATA|DATA 
|DATA|DATA|DATE|2|DATA|DATA 
|DATA|DATA|DATE|2|DATA|DATA 

あるファイルからこれらのような行の多くを削除したいと思います作り上げます1300万行2番目、3番目、または10番目の4番目の要素の行はすべて互いに似ていますので、ファイルの90%を切り捨てたいと思います。メッセージタイプのいくつかのカウントを取得するには、私はその行は、私が最も一般的なメッセージがどのように再現性を決定するために使用したものだったが、それがない3

awk -F"|" '$4=="3"' capture.txt > out.txt 

の第四の要素を持つすべての行を見つけるために、このコマンドを実行することができましたこれらのレコードを整理するのに役立つものは何もありません。私が本当に望むのは、新しいファイルを作成することです。これには、ファイルを1回通過することで可能ですか?

(All records where pipe deliminated 4th element is not 2, 3 or 10) + 
    (1 out of every 10 records where the 4th element is 2, 3 or 10) 

2つのファイルを作成して、4番目の要素が2番目、3番目、または10番目のレコードを、4番目の要素が異なるものから分離することができたと考えました。私は1つのファイルから10行ごとに落ちて、一緒に戻ってくる可能性があります。しかし私の本当の好みは、これを1回のパスで行い、元のファイル順序を保持することです。

どのような考えですか?

+0

サンプル入力では、$ 4ではなく$ 5が気になるようです。 –

答えて

4

無作為化アプローチでしょうより良くなる。

awk -F'|' 'BEGIN{srand()} $5~/^(2|3|10)$/{if(rand()<0.1) print; next}1' file 

これらの行を印刷する可能性は約10%ですが、繰り返し設定できるようにシードを設定することもできます。 4番目ではなく、5番目のフィールドを確認する必要があることに注意してください。

+0

これは、私の貧弱な試みよりも良いアイデアとクリーンな実装の両方です。私は今仕事に戻ってきます。 –

0

あなたが提供するサンプル入力が$ 4で定数文字列「DATE」を持っていますが、$ 5は2,3、および4を持っているので、あなたはおそらくのようなものを探しています:おそらく

awk '$5 != 2 && $5 != 3 && $5 != 10 {print; next} a++%10 == 0' FS=\| input > output 
関連する問題