フィールドに浮動小数点値を含むCSVファイルのレコードをフィルタリングし、postal_code
ヘッダーも出力に含めたいと思います。
サンプルCSVファイルは次のとおりです。
> ca test.csv
employee_id|postal_code
1|56024.4
1|752066
予想される出力は次のとおりです。
employee_id|postal_code
1|752066
私が試したこと:
> awk '$2 != "." {print $0} ' test.csv
1|56024.4
1|752066
ベストアンサー1
コマンドは、awk
スペースで区切られた2番目のフィールドがドットかどうかをテストします。 2番目のスペースで区切られたフィールドがないため、ファイルのすべての内容を出力します。
使用ミラーmlr
()は、ドットを含むフィールド(ヘッダーなど)の出力からレコードをフィルタリングします。postal_code
ca
$ mlr --csv --fs pipe filter -S '$postal_code !=~ "[.]"' file
employee_id|postal_code
1|752066
フィールド値を正規表現(で置換可能)と一致させてフィールド$postal_code !=~ "[.]"
値をテストし、テストが成功した場合にレコードを削除するフィルタ式。postal_code
[.]
\.
この操作-S
のオプションはfilter
フィールドの型推論をオフにするため、データはまだ浮動小数点ではない文字列です。
フィルタ式を使用して、フィールドに数字のみを含むレコードを$postal_code =~ "^[[:digit:]]+$"
許可することもできます。postal_code
特定の桁数(たとえば)を要求することで、これをより厳密にすることができます$postal_code =~ "^[[:digit:]]{6}$"
。