我正在嘗試撰寫一個 Bash 腳本來檢查并回傳 CSV 中不符合某些條件的行的 ID。示例 CSV 如下所示,我正在考慮 [ -z {$CATEGORY} ] 方法來識別 CSV 的 CATEGORY 列中的空值單元格。但是,我的 if 陳述句似乎沒有捕獲 CSV 中的空值,因此需要幫助
ID,DATE,PRODUCT CODE,CATERGORY
1,01/01/2000,10009,1
2,02/01/2000,9999,2
3,25/01/2000,1009,3
4,15/09/2000,2001,5
5,09/25/2000,2003,4
6,09/10/01,2091,P
7,20/02/2002,3098,6
8,01/03/2003,4097,3
9,03/04/2004,5000,2
10,05/02/2013,4000,1
11,10/01/2015,9,
這是我的 bash 腳本代碼,空值在 ID = 11 的行中
#!/bin/bash
FILE=${1}
IFS=$'\n'
((c=-1))
for row in $(cat $FILE)
do
((c ))
if ((c==0))
then
continue
fi
IFS=','
read ID DATE PRODUCT CATEGORY <<<${row}
if [ -z {$CATEGORY} ];
then
echo "$ID" >> file.txt
fi
done
uj5u.com熱心網友回復:
-z {$CATEGORY}
應該是-z ${CATEGORY}
,但read ID ... <<< ${row}
只會分配ID
...嘗試:
#!/bin/bash
while IFS=, read -r ID DATE PRODUCT CATEGORY; do
if [[ "$CATEGORY" =~ ^[[:space:]]*$ ]]; then
echo "$ID"
fi
done < <( tail -n 2 "$1" ) > file.txt
請注意awk
orsed
會更快更簡單(例如,參見https://mywiki.wooledge.org/DontReadLinesWithFor)。示例awk
(使用最近的 BSD 和 GNU 測驗awk
):
awk -F, 'NR>1 && $NF ~ /^[[:space:]]*$/ {print $1}' "$FILE" > file.txt
示例sed
(使用最近的 BSD 和 GNU 測驗sed
):
sed -En 's/^([^,]*).*,[[:space:]]*$/\1/p' "$FILE" > file.txt
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/496494.html