Скрипт Bash для работы с CSV-файлом

Скрипт Bash для работы с CSV-файлом

У меня есть следующий CSV-файл:

    "V1","V2","V3","V4","V5","V6","V7","V8","V9","V10","Class"
65,Female,0.7,0.1,187,16,18,6.8,3.3,0.9,1
62,Male,10.9,5.5,699,64,100,7.5,3.2,0.74,1
62,Male,7.3,4.1,490,60,68,7,3.3,0.89,1
58,Male,1,0.4,182,14,20,6.8,3.4,1,1
72,Male,3.9,2,195,27,59,7.3,2.4,0.4,1
46,Male,1.8,0.7,208,19,14,7.6,4.4,1.3,1

Меня интересуют только столбцы V1:age, V2:sex, V8:grade1, V9:grade2.

Я хотел бы создать bash-скрипт, который будет выводить данные, где V9 равен 3, и сортировать вывод по полу, отображая сначала данные о женщинах.

Я полный новичок в скриптах bash, и хотя я знаю, как получить такой вывод из оболочки, в плане команд скрипта bash я смог придумать только следующее:

#!/usr/bin/env bash

INPUT=./phpOJxGL9.csv
OLDIFS=$IFS
IFS=','
[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }

echo Grade2 = 3
echo Age Sex Grade2 Grade1 
echo '************************'


while read V1 V2 V3 V4 V5 V6 V7 V8 V9 V10

do
      if [ $V9 -eg "3" ];
      then
      cut -d',' -f1,2,8,9 | sort -k2 -t','
      fi
      

done < $INPUT
IFS=$OLDIFS

Результат должен выглядеть примерно так:

введите описание изображения здесь

Кто-нибудь может помочь?

решение1

Ваш собственный скрипт bash — хорошее начало. Но использование подходящих инструментов может облегчить жизнь. Вот пример: в вашем примере ввода нет v9=3, поэтому я использовал v9>=3 только для демонстрации команды.

tail -n+2 your-input | awk -F, '($9>=3){print $1, $2, $8, $9}' | sort -k2 | awk 'OFS="," {print $1,$2,$3,$4}'

65,Female,6.8,3.3
58,Male,6.8,3.4
62,Male,7,3.3
62,Male,7.5,3.2
46,Male,7.6,4.4

Пояснение: tail -n+2 просто удаляет строку заголовка.

обратите внимание, что перед использованием опции сортировки столбцов необходимо использовать разделитель табуляцией или пробелом

второй awk — заменить пробелы запятыми

решение2

Ваш скрипт уже почти готов. Осталось только проверить условие if, если V9равно 3. Чтобы сначала показать женские данные, я бы предложил поместить цикл while в функцию, которая требует пол в качестве первого аргумента, а затем запустить функцию по одному разу для каждого пола.

INPUT=phpOJxGL9.csv
OLDIFS=$IFS
IFS=','

[ ! -f $INPUT ] && { echo "$INPUT file not found"; exit 99; }

function readCsv {
    while read V1 V2 V3 V4 V5 V6 V7 V8 V9 V10
    do
        requiredGender="$1"

        if [[ "$V2" == "$requiredGender" ]]
        then
            if [[ "$V9" == "3" ]]
            then
                echo "$V1,$V2,$V8,$V9"
            fi
        fi
    done < $INPUT
}

echo Grade2 = 3
echo Age Sex Grade2 Grade1 
echo '************************'

echo
echo "Women"
echo "--------------"

readCsv "Female"

echo
echo "Men"
echo "--------------"

readCsv "Male"

IFS=$OLDIFS

Для запуска скрипта его необходимо сделать исполняемым:

chmod +x script.sh
./script.sh

Имейте в виду, что файл csv, который вы предоставили выше, не содержит ни одного столбца, где V9is равно 3, поэтому запуск скрипта выше не выведет никаких данных. Я добавил эти два образца столбцов:

50,Female,,,,,,1,3,,
50,Male,,,,,,1,3,,

и вот вывод скрипта:

Grade2 = 3
Age Sex Grade2 Grade1
************************

Women
--------------
50,Female,1,3

Men
--------------
50,Male,1,3

Связанный контент