Alex Keda писал(а):таки год в начало, месяц, потом дату
тока месяц должен быть числовой
и сортировать по человечески ...
Месяц прописью из лога.
Понятно, что можно преобразование наворотить, но это как-то совсем наворочено будет...
И еще на заметку, в памятку...
Озадачился, тут намедни, фильтрацией данных в командной строке.
Суть вопроса в чем?
Есть некий текстовый файл с данными.
"Хочу посчитать количество встречающихся известных цифирь."
Звучит вроде просто.
Но, что я получаю...
Меня удручает:
Код: Выделить всё
cat 2017-10-31_full.txt | grep ", 307"
odlkmax_23679_1509170974.418754, 307
odlkmax_17245_1509210784.571775, 307
odlkmax_17332_1509210793.818450, 307
odlkmax_29899_1509221316.862000, 307
odlkmax_3904_1509226874.866412, 307
odlkmax_31238_1508403581.170446, 655, 307
odlkmax_5509_1509256589.421416, 307
Ладно, допустим, а если так:
Код: Выделить всё
cat 2017-10-31_full.txt | grep ", 30"
odlkmax_23679_1509170974.418754, 307
odlkmin_29851_1508380755.414015, 30
odlkmax_17245_1509210784.571775, 307
odlkmax_17332_1509210793.818450, 307
odlkmax_29899_1509221316.862000, 307
odlkmax_3904_1509226874.866412, 307
odlkmax_31238_1508403581.170446, 655, 307
odlkmax_5509_1509256589.421416, 307
то еще и "30-ка" добавляется.
Понятное дело, что если так:
то их вообще очень много получается.
Пробовал конструкцию вида:
Код: Выделить всё
cat 2017-10-31_full.txt | grep ", 307" | awk '$2 == 307,$3 == 307'
odlkmax_23679_1509170974.418754, 307
odlkmax_17245_1509210784.571775, 307
odlkmax_17332_1509210793.818450, 307
odlkmax_29899_1509221316.862000, 307
odlkmax_3904_1509226874.866412, 307
odlkmax_31238_1508403581.170446, 655, 307
odlkmax_5509_1509256589.421416, 307
Взятую из
http://khpi-iip.mipk.kharkiv.edu/librar ... g/p11.html
но в ней тоже есть "подводный камень".
Который заключается в том, что ", 655, 307" могут быть произвольными в своем порядке.
Т.е.
Код: Выделить всё
", 655, 307",
", 655, 307, 3030"
", 655, 455, 725, 836, 307"
А каждый из них это разное число i-тых элементов:
Код: Выделить всё
cat 2017-10-31_full.txt | grep ", 307" | awk '$2 == 307,$3 == 307'
cat 2017-10-31_full.txt | grep ", 307" | awk '$2 == 307,$3 == 307,$4 == 307'
cat 2017-10-31_full.txt | grep ", 307" | awk '$2 == 307,$3 == 307,$4 == 307,$5 == 307'
Получается огород какой-то.
А хочется получить именно все содержащие "307-ые" или все "30-ые" строки.
Пробовал такой вариант:
Код: Выделить всё
cat 2017-10-31_full.txt | grep ", 307" | awk 'match($0,/307/) {START2 = index($0,"307");print
307
307
307
307
307
307
307
но тоже с теми-же косяками.
Ближе всех такой вариант:
Код: Выделить всё
cat 2017-10-31_full.txt | awk '{for(i=1;i<=NF;i++){ if($i=="307"){print $i} } }'
307
307
307
307
307
307
307
Что правильно.
или так
Код: Выделить всё
cat 2017-10-31_full.txt | awk '{for(i=1;i<=NF;i++){ if($i=="30"){print $i} } }'
30
Что тоже правильно.
Но абсолютно не верно если условие достигает 3 (тройки).
Код: Выделить всё
cat 2017-10-31_full.txt | awk '{for(i=1;i<=NF;i++){ if($i=="3"){print $i} } }'
Т.к. есть тройки в строках с данными.
Что их отделить нужно фильтровать по ", 3",
но эти значения в i не подставишь, что логично.
Пробовал еще такие варианты:
Код: Выделить всё
cat 2017-10-31_full.txt | grep ", 307" | awk '{for(i=1;i<=NF;i++){ if($i=="307"){print $i} } }'
307
307
307
307
307
307
307
или
Код: Выделить всё
cat 2017-10-31_full.txt | grep ", 30" | awk '{for(i=1;i<=NF;i++){ if($i=="30"){print $i} } }'
30
или
Код: Выделить всё
cat 2017-10-31_full.txt | grep ", 3" | awk '{for(i=1;i<=NF;i++){ if($i=="3"){print $i} } }'
[на выходе пусто, что правильно]
Понятно, что само значение "3" это подставляется в виде переменной в скрипте.
Но, сначала, оное должно отработать в CLI.
Было подсказано, грамотным человеком, искать в направлении использования конструкции на sed (sed -n '/.*7.*/p')
Попробован пример для 7-ки.
Код: Выделить всё
cat 2017-06-30_full.txt | grep ", 7" | sed -n '/.*7.*/p'
odlk3_7515_1498741105.011651, 7, 270
odlk3_31868_1498237437.342564, 35, 7
odlk3_19163_1498768687.158794, 717
в примере выше появляется строка 717, т.к. есть семерка.
Но для меня такая строка "лишняя".
Правильный результат должен был быть как:
Код: Выделить всё
odlk3_7515_1498741105.011651, 7, 270
odlk3_31868_1498237437.342564, 35, 7
Подбрал "вручную" некий вариант.
Но есть-ли в нем подводные камни?
Пока не понимаю.
Примерный алгоритм поиска решения:
Код: Выделить всё
cat 2017-06-30_full.txt | grep ", 7"
odlk3_7515_1498741105.011651, 7, 270
odlk3_31868_1498237437.342564, 35, 7
odlk3_19163_1498768687.158794, 483, 717
Применим все-таки вариант "счетчик"
Код: Выделить всё
cat 2017-06-30_full.txt | grep ", 7" | awk '{for(i=1;i<=NF;i++){if($i=="7") {print $1} } }'
odlk3_31868_1498237437.342564,
Смотрим по "второму принту"
Код: Выделить всё
cat 2017-06-30_full.txt | grep ", 7" | awk '{for(i=1;i<=NF;i++){if($i=="7") {print $2} } }'
35,
Смотрим по "следующему принту"
Код: Выделить всё
cat 2017-06-30_full.txt | grep ", 7" | awk '{for(i=1;i<=NF;i++){if($i=="7") {print $3} } }'
7
На выходе увидели одну "явную 7".
Попробуем поменять "принт" на i-тый элемент:
Код: Выделить всё
cat 2017-06-30_full.txt | grep ", 7" | awk '{for(i=1;i<=NF;i++){if($i=="7") {print $i} } }'
7
Долго мусолил:
https://www.ibm.com/developerworks/library/l-awk1/
https://www.ibm.com/developerworks/libr ... k1-pdf.pdf
Пока догадался в чем "соль".
Пробуем добавить еще одно условие, теперь так:
Код: Выделить всё
cat 2017-06-30_full.txt | grep ", 7" | awk '{for(i=1;i<=NF;i++){if($i=="7" || $i=="7,") {print $i} } }'
7,
7
Эврика!
Первая "7," от первой строки, вторая "7" от второй строки и не имеет конечной запятой.
А третьей ("717", "71") и нет, т.к. не проходит под условие.
Модифицирую код в скрипте под пример:
Код: Выделить всё
count=`cat $file | grep ", $i" | awk -v Key="$i" '{for(k=1;k<=NF;k++){ if($k==Key || $k=="Key,"){print $k} } }' | wc -l|awk '{print $1}'`
И "вроде" теперь получаю правильные данные...
Хотя уверенности полной пока еще нет - про двойные цифири (это когда 30 и 307).
Правда вручную посчитанный массив с условием 30-307 дал такой-же результат как и скрипт.
Попробовал вручную еще пару массивов перепроверить, вроде тоже правильно получилось.
Но кто знает, всегда-ли это будет верный результат?