У меня есть файл данных на 16 миллионов строк, который я использую как часть инструмента регрессионного тестирования / воспроизведения. В данных много похожих строк. Я хотел бы удалить многие из этих похожих строк из файлов
Файл в формате
|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
Файл состоит из 16 миллионов строк, а строки с 4-м элементом, состоящим из 2, 3 или 10, составляют 13 миллионов строк. Строки с 4-м элементом из 2, 3 или 10 похожи друг на друга, поэтому я хотел бы удалить 90% из них из файла. Чтобы получить некоторое количество типов сообщений, я смог запустить эту команду, чтобы найти все строки с 4-м элементом из 3
awk -F"|" '$4=="3"' capture.txt > out.txt
Эта строка была тем, что я использовал, чтобы определить, насколько повторяемы наиболее распространенные сообщения, но она не помогает мне сократить эти записи. Я действительно хочу иметь возможность создать новый файл, включающий
(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)
Возможно ли это за один проход по файлу? Я решил, что могу создать два файла, отделяя записи с 4-м элементом 2, 3 или 10 от тех, у которых был другой 4-й элемент. Тогда я мог бы, вероятно, отбросить каждую 10-ю строчку из одного файла и снова объединить их. Но на самом деле я предпочитаю делать это за один проход и сохранять исходный порядок файлов.
Есть предположения?