Если вы хотите сопоставить оценки выше ] 50
, вы бы сделали что-то вроде:
awk '{sum=($2+$3)/2 ; split(sum,a,"."); if(a[1] > 50) printf("%.3f\n", sum)}' grades
Сохраните результат в переменной sum
. Используйте функцию split
, чтобы сопоставить первую часть перед .
поставьте точку и напечатайте результат
Если вы хотите распечатать номер студента, вы должны изменить строку printf
следующим образом:
printf ("Student:% s \ t% .3f \ n ", $ 1, сумма)
В качестве шага к ответу вам может пригодиться следующая функция оболочки. Я написал его для просмотра CSV в командной строке в красивом "красивом" виде.
Обратите внимание, что удаляет заключенные в кавычки запятые и новые строки в кавычках (и двойные кавычки в кавычках), что может быть не тем, что вам нужно, но полезно для быстрого просмотра и правильного выравнивания столбцов.
excel() {
sed -E -e ':t' -e '/^[^"]*("[^"]*"[^"]*)*$/!{N;s/\n//;bt' -e'}' "$@" |
awk -F\" -v OFS= 'NF>1 {for (i=2;i<=NF;i+=2) gsub(/,/, "", $i)} 1' |
sed 's/,/,"/g' | column -ts, | tr -d '"' | less -S
}
На самом деле, это не так уж сложно. Вам нужно только использовать более конкретный шаблон, чем {. *}
:
sed 's/"{\([0-9],\)\+[0-9]}",//' details.csv
Разбиение каждой строки на массив на "
в качестве разделителя - гораздо более простой подход. Тогда ваш массив int становится элементом 1 массива, который мы можем установить в нулевую строку, а к следующему (элемент 2) будет добавлена дополнительная запятая в конце, поэтому мы можем извлечь подстроку этой строки, начиная со второго символа. Теперь нам нужно разобраться с возвратом двойных кавычек в часть {NORMAL, BOOKING}
каким-то образом. Если разделить строку на "
в качестве разделителя, об этом также позаботятся, потому что тогда в строке будет поле 3. В В случае других строк, кавычек больше нет, поэтому наш массив элементов будет содержать только элементы до индекса 2. Если есть индекс №3, мы знаем, что должны указать это.
Приведенный ниже однострочный файл perl работает точно так же, как описано выше:
$ perl -F'"' -lane '$F[1]="";$F[2]=substr($F[2],1);$F[3]= "\"" . $F[3] . "\"" if $F[3];print @F' inpu>
1,2,3,4,5,2015-07-30 23:17:12,2015-07-30 23:39:12,103.4,104.2,1.2,{NORMAL},1,2,
2,2,6,4,5,2015-07-30 12:17:12,2015-07-30 12:39:12,103.4,104.2,1.8,{BOOKING},1,2,
3,2,3,4,9,2015-07-30 10:17:12,2015-07-30 10:39:12,103.4,104.2,1.9,"{NORMAL,BOOKING}",1,2,
Использование csvkit
:
$ csvcut -C 11 details.csv
1,2,3,4,5,2015-07-30 23:17:12,2015-07-30 23:39:12,103.4,104.2,1.2,{NORMAL},1,2,
2,2,6,4,5,2015-07-30 12:17:12,2015-07-30 12:39:12,103.4,104.2,1.8,{BOOKING},1,2,
3,2,3,4,9,2015-07-30 10:17:12,2015-07-30 10:39:12,103.4,104.2,1.9,"{NORMAL,BOOKING}",1,2,