CSVファイルで条件付きの特定の行を計算して削除する方法は?

CSVファイルで条件付きの特定の行を計算して削除する方法は?

次のCSVファイルがあります。

id,country
12343,China
23455,Japan
47,Singapore
374,Australia
6572e,United Kingdom
  • まず、列IDの長さが3より大きい行の総数を計算したいと思います。
  • 次に、IDの長さが5ではなく、IDにアルファベット文字を含む行を削除したいと思います。
  • 最後に、結果を保存する新しいファイルを作成したいと思います。

awkメソッドを試しましたが、次のような結果が得られました。

mylaptop@MacBook-Pro ~ % awk 'length($1)!=19 {c++} END {print c+0}' myfile
quote> 

次のコマンドを入力すると:

mylaptop@MacBook-Pro ~ % awk 'length($1)!=19 {c++} END {print c+0}' <myfile>

以下が表示されます。

zsh: parse error near `\n'

予想される出力はMac端末に似ている必要があります。

mylaptop@MacBook-Pro ~ % awk 'length($1)!=19 {c++} END {print c+0}' myfile
4

ファイルのすべての変更を保存します。

私はLinuxを初めて使用するために3つの質問の完全なコマンドを表示できますか?

答え1

これは宿題だと思います!

列 1 の長さが 3 より大きい行数を計算します。

awk 'length($1)>3 {c++} END {print c+0}'

最初の列の長さが5以外の行を削除します。

awk 'length($1)==5'

列 1 の長さが 5 ではなく、数字以外の行を削除します。

awk 'length($1)==5 && $1 !~ /[^0-9]/'

シェルを使用して出力を新しいファイルとして指定します。

編集:ファイルは元のタブ区切りファイルとして表示され、現在はCSVで編集されています。これは解決策が必要であることを意味します。

awk -F, 'length($1)>3 {c++} END {print c+0}'
awk -F, 'length($1)==5'
awk -F, 'length($1)==5 && $1 !~ /[^0-9]/'

答え2

カンマ区切りの最初のフィールドが3文字を超える行数を計算するには、タイトルと最初のフィールドの長さが4文字以外の行を削除してから、残りの行数を計算します。

sed -e '1d' -e '/^[^,]\{4,\},/!d' file | wc -l

このdコマンドは、古いアドレス(行番号または正規表現)でアドレス指定された行を削除します。上記の条件が満たされない場合、 !d削除が開始されます。

この式は、^[^,]\{4,\},行の先頭でカンマではなく4つ以上のコンマと一致します。

ヘッダーを保持し、結果を新しいファイルに保存しながら、最初のフィールドの長さが正確に5桁ではないすべての行を削除します。

sed -e '1b' -e '/^[[:digit:]]\{5\},/!d' file >newfile

このbコマンドを使用して、最初の入力行のスクリプトの最後に分岐し、次のループにジャンプします。これにより、ヘッダー行は削除されずに印刷されます。

この式は、^[[:digit:]]\{5\},行の先頭の正確に5桁の数字の後にカンマが続くものと一致します。

関連情報