我有以下 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 腳本的 100% 初學者,雖然我知道如何從 shell 獲取此輸出,但我只能在涉及 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 條件 if V9
is equal to 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