csv 파일을 조작하는 Bash 스크립트

csv 파일을 조작하는 Bash 스크립트

다음 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 열에만 관심이 있습니다.

V9가 3인 데이터를 출력하고 출력을 성별로 정렬하여 여성 데이터를 먼저 표시하는 bash 스크립트를 만들고 싶습니다.

저는 bash 스크립트의 100% 초보자이며 쉘에서 이 출력을 얻는 방법을 알고 있지만 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 파일에는 V9과 같은 단일 열이 포함되어 있지 않으므로 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

관련 정보