次のようにCSVファイルにデータを蓄積しました。
Parameter_1,Parameter_2,Parameter_3,Parameter_4,Parameter_5,Parameter_6
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1,Parameter_2,Parameter_3,Parameter_4,Parameter_5
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1,Parameter_2,Parameter_3
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1
Parameter_1,Parameter_2,Parameter_3,Parameter_4
4つ以上のパラメータを持つ行をどのように読み取ることができますか?
Parameter_1,Parameter_2,Parameter_3,Parameter_4,Parameter_5,Parameter_6
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1,Parameter_2,Parameter_3,Parameter_4
Parameter_1,Parameter_2,Parameter_3,Parameter_4,Parameter_5
Parameter_1,Parameter_2,Parameter_3,Parameter_4
X Parameter_1,Parameter_2,Parameter_3 X DO NOT READ THIS because it has less than 4 parameters
Parameter_1,Parameter_2,Parameter_3,Parameter_4
X Parameter_1 X DO NOT READ THIS because it has less than 4 parameters
Parameter_1,Parameter_2,Parameter_3,Parameter_4
理想的には、以下より多くを読んでみたいです。 Xパラメータと未満はいパラメータ - つまり、指定された行にパラメータが多すぎると読み込まれません。
尋ねる:BASHでこれをどう書きますか?
? ㅏ:コードは次のようになります。
number_of_parameters=`"$line" | sed 's/[^,]//g' | wc -c` #where $line is the line thats being currently read
if [ "number_of_parameters" -gt "X" ] && [ "number_of_parameters" -lt "Y" ]
then
... do something
fi
答え1
grepを使用すると、より簡単な解決策が得られます。
grep -E '^(.*,){3}' my_csv_file.csv
4つ以上のパラメータには少なくとも3つのカンマがあるため、正規表現では3つになります。
(.*,)カンマが付いた引数と一致します。.*すべての文字(.)が0回以上一致することを示します。
変数に値を格納する別の方法は次のとおりです。
my_var=$(grep -E '^(.*,){3}' my_csv_file.csv)
echo "$my_var"
$my_varの周りに ""があることを確認してください。それ以外の場合は改行文字が失われます。
答え2
これは間違いなく解決する必要がある作業や同様の作業ではありませんが、自然に解決するためにsed
使用grep
されますawk
。 4つ以上の(カンマ区切り)フィールドを含むファイルの行をフィルタリングするには、次の手順を実行します。
awk -F, 'NF>=4' my_csv_file.csv
たとえば、4つ以上6つ(カンマ区切り)フィールドで行をフィルタリングするには、次の手順を実行します。
awk -F, 'NF>=4 && NF<=6' my_csv_file.csv