вырезать столбец массива int в CSV без вырезания другого массива varchar

Если вы хотите сопоставить оценки выше ] 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, сумма)

2
06.12.2016, 04:30
4 ответа

В качестве шага к ответу вам может пригодиться следующая функция оболочки. Я написал его для просмотра 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
}
0
27.01.2020, 22:10

На самом деле, это не так уж сложно. Вам нужно только использовать более конкретный шаблон, чем {. *} :

sed 's/"{\([0-9],\)\+[0-9]}",//' details.csv
2
27.01.2020, 22:10

Разбиение каждой строки на массив на " в качестве разделителя - гораздо более простой подход. Тогда ваш массив 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,
0
27.01.2020, 22:10

Использование 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,
0
27.01.2020, 22:10

Теги

Похожие вопросы