iimon TECH BLOG

iimonエンジニアが得られた経験や知識を共有して世の中をイイモンにしていくためのブログです

ターミナルでCSVを触ってみる

はじめに

こんにちは。バックエンドエンジニアの木暮です。

前職では運用業務でサーバに入ってCUI環境で作業を行うことがありましたが、 現職はローカルでの開発業務がメインであまりそういったことを行う機会がありません。
しばらく触っていないと忘れてしまいそうなのでこの機会に使用頻度の高かったコマンドの復習をしてみました。

今回はサンプルとして以下のCSVファイルを使っています。

jusyo.jp

今回紹介するコマンドで行える操作は以下の通りです。
数は多くありませんがどれも便利なコマンドです。

文字コードの確認と変換

まずはダウンロードができたのでファイルの中身を確認してみましょう。

[kogure:~/test]
$ ls -l
total 42336
-rw-rw-r--@ 1 kogure  staff  21674202 12  4 21:48 zenkoku.csv

[kogure:~/test]
$ head zenkoku.csv
"�Z��CD","�s���{��CD","�s�撬��CD","����CD","�X�֔ԍ�","���Ə��t���O","�p�~�t���O","�s���{��","�s���{���J�i","�s�撬��","�s�撬���J�i","����","����J�i","����⑫","���s�ʂ薼","������","�����ڃJ�i","�⑫","���Ə���","���Ə����J�i","���Ə��Z��","�V�Z��CD"
64094100,1,1101,11010001,"064-0941",0,0,"�k�C��","�z�b�J�C�h�E","�D�y�s������","�T�b�|���V�`���E�I�E�N","���P�u","�A�T�q�K�I�J",,,,,,,,,
64857500,1,1101,11010001,"064-8575",1,0,"�k�C��","�z�b�J�C�h�E","�D�y�s������","�T�b�|���V�`���E�I�E�N","���P�u","�A�T�q�K�I�J",,,,,,"�Љ���@�l�@�D�y���[��@���[��a�@","�V���J�C�t�N�V�z�E�W���@�T�c�|���W�P�C�J�C�@�W�P�C�J�C�r���E�C��","���P�u�T���ڂU�ԂT�O��",
64853500,1,1101,11010001,"064-8535",1,0,"�k�C��","�z�b�J�C�h�E","�D�y�s������","�T�b�|���V�`���E�I�E�N","���P�u","�A�T�q�K�I�J",,,,,,"�k�C���@�D�y���u�����w�Z","�z�c�J�C�h�E�@�T�c�|���A�T�q�I�J�R�E�g�E�K�c�R�E","���P�u�U���ڂT�ԂP�W��",
60000000,1,1101,11010079,"060-0000",0,0,"�k�C��","�z�b�J�C�h�E","�D�y�s������","�T�b�|���V�`���E�I�E�N","����","�E�`�n�V","�i�Y���Ȃ��j",,,,"�i�V�X�O�̂P�@�j",,,,
60872100,1,1101,11010079,"060-8721",1,0,"�k�C��","�z�b�J�C�h�E","�D�y�s������","�T�b�|���V�`���E�I�E�N","����","�E�`�n�V","�i�Y���Ȃ��j",,,,,"��ہ@������Ё@����މc�Ɩ{��","�_�C�}���@�J�u�V�L�K�C�V���@�J�~�z�E�U�C�G�C�M���E�z���u","�k�R�𐼂P�S���ڂQ��",
60855200,1,1101,11010079,"060-8552",1,0,"�k�C��","�z�b�J�C�h�E","�D�y�s������","�T�b�|���V�`���E�I�E�N","����","�E�`�n�V","�i�Y���Ȃ��j",,,,,"���Q�ی��W���p����{�����@�������","�\���K�C�z�P���W���p���j�c�|���R�E�A�@�J�u�V�L�K�C�V��","�k�P�𐼂U���ڂQ�Ԓn���ۃW���p����{�����D�y�r��",
60860200,1,1101,11010079,"060-8602",1,0,"�k�C��","�z�b�J�C�h�E","�D�y�s������","�T�b�|���V�`���E�I�E�N","����","�E�`�n�V","�i�Y���Ȃ��j",,,,,"������Ё@����V���Ё@�k�C���x��","�J�u�V�L�J�C�V���@�A�T�q�V���u���V���@�z�c�J�C�h�E�V�V��","�k�P�𐼂P���ڂU�Ԓn�����ۂ�n���X�N�G�A�X�K",
60850400,1,1101,11010079,"060-8504",1,0,"�k�C��","�z�b�J�C�h�E","�D�y�s������","�T�b�|���V�`���E�I�E�N","����","�E�`�n�V","�i�Y���Ȃ��j",,,,,"�x�m�ʁ@������Ё@�k�C���x��","�t�W�c�E�@�J�u�V�L�K�C�V���@�z�c�J�C�h�E�V�V��","�k�Q�𐼂S���ڂP�Ԓn�D�y�O��i�o�r���f�B���O",
60840600,1,1101,11010079,"060-8406",1,0,"�k�C��","�z�b�J�C�h�E","�D�y�s������","�T�b�|���V�`���E�I�E�N","����","�E�`�n�V","�i�Y���Ȃ��j",,,,,"�k�C���e���r��@�������","�z�c�J�C�h�E�e���r�z�E�\�E�@�J�u�V�L�J�C�V��","�k�P�𐼂P���ڂU�Ԓn",

文字化けしていますね。
文字コードを確認してみましょう。
文字コードをターミナルで確認したい場合はnkfコマンドを使います。
macnkfコマンドを使いたい場合はHomebrewでインストールしましょう。

nkf --guess <確認したいファイルの絶対パス or 相対パス>
--guess :ファイルの文字コードと改行コードを標準出力

[kogure:~/test]
$ nkf --guess zenkoku.csv
Shift_JIS (CRLF)

文字コードがShift-JISなので文字化けしている様なので文字コードを変更します。ついでに改行コードも変更します。

nkf -w -Lu --overwrite <変換したいファイルの絶対パス or 相対パス>
-w :文字コードutf-8に変換
-Lu :改行コードをLFに変換
--overwrite :ファイルを上書き

[kogure:~/test]
$ nkf -w -Lu --overwrite zenkoku.csv

[kogure:~/test]
$ nkf --guess zenkoku.csv
UTF-8 (LF)

[kogure:~/test]
$ head zenkoku.csv
"住所CD","都道府県CD","市区町村CD","町域CD","郵便番号","事業所フラグ","廃止フラグ","都道府県","都道府県カナ","市区町村","市区町村カナ","町域","町域カナ","町域補足","京都通り名","字丁目","字丁目カナ","補足","事業所名","事業所名カナ","事業所住所","新住所CD"
64094100,1,1101,11010001,"064-0941",0,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","旭ケ丘","アサヒガオカ",,,,,,,,,
64857500,1,1101,11010001,"064-8575",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","旭ケ丘","アサヒガオカ",,,,,,"社会福祉法人 札幌慈啓会 慈啓会病院","シヤカイフクシホウジン サツポロジケイカイ ジケイカイビヨウイン","旭ケ丘5丁目6番50号",
64853500,1,1101,11010001,"064-8535",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","旭ケ丘","アサヒガオカ",,,,,,"北海道 札幌旭丘高等学校","ホツカイドウ サツポロアサヒオカコウトウガツコウ","旭ケ丘6丁目5番18号",
60000000,1,1101,11010079,"060-0000",0,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,"(790の1 )",,,,
60872100,1,1101,11010079,"060-8721",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,,"大丸 株式会社 紙包材営業本部","ダイマル カブシキガイシヤ カミホウザイエイギヨウホンブ","北3条西14丁目2番",
60855200,1,1101,11010079,"060-8552",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,,"損害保険ジャパン日本興亜 株式会社","ソンガイホケンジヤパンニツポンコウア カブシキガイシヤ","北1条西6丁目2番地損保ジャパン日本興亜札幌ビル",
60860200,1,1101,11010079,"060-8602",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,,"株式会社 朝日新聞社 北海道支社","カブシキカイシヤ アサヒシンブンシヤ ホツカイドウシシヤ","北1条西1丁目6番地さっぽろ創生スクエア9階",
60850400,1,1101,11010079,"060-8504",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,,"富士通 株式会社 北海道支社","フジツウ カブシキガイシヤ ホツカイドウシシヤ","北2条西4丁目1番地札幌三井JPビルディング",
60840600,1,1101,11010079,"060-8406",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,,"北海道テレビ放送 株式会社","ホツカイドウテレビホウソウ カブシキカイシヤ","北1条西1丁目6番地",

無事文字化けが解消できました。

CSVファイルの行数を確認

ファイルの行数を確認したい時はwcコマンドを使用します。

wc -l <確認したいファイルの絶対パス or 相対パス>
-l :改行の数を表示

$ wc -l zenkoku.csv
  150104 zenkoku.csv

注意しないといけない点は改行の個数をカウントしているだけなので 末尾行の改行の有無で数字が変わってきます。

北海道の住所データは何件あるのでしょうか?
grepした標準出力の行数をカウントして出してみましょう。

grep <検索したい文字列> <検索したいファイルの絶対パス or 相対パス> | wc -l

「|」はパイプと読みます。 標準出力の内容を次のコマンドに渡す時に使用します。
パイプは何回でも使うことができます。
上記コマンドはgrepを実行→grepの実行結果の行数をカウントというコマンドになります。
(パイプの説明のために上記コマンドを紹介していますが、後述の内容で同様の処理を行ってくれるgrep -cというコマンドがありますので普段はそちらを使うのがベターです)

[kogure:~/test]
$ grep "北海道" zenkoku.csv | wc -l
   10329

上記コマンドは単純に検索結果の行数をカウントしているだけなので本当にあっているか念の為確認してみます。
都道府県別に行が並んでいるかと思うので10321行目から10340行目を見てみましょう。

[kogure:~/test]
$ cat -n zenkoku.csv | head -n 10340 | tail -n 20
 10321  86175200,1,1694,16940018,"086-1752",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","幌萌町","ホロモエチョウ",,,,,"(以下を除く 40−1、623番地)",,,,
 10322  86183300,1,1694,16940019,"086-1833",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","本町","ホンチョウ",,,,,,,,,
 10323  86183500,1,1694,16940020,"086-1835",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","松法町","マツノリチョウ",,,,,,,,,
 10324  86181400,1,1694,16940021,"086-1814",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","岬町","ミサキチョウ",,,,,,,,,
 10325  86182100,1,1694,16940022,"086-1821",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","緑町","ミドリチョウ",,,,,,,,,
 10326  86175100,1,1694,16940023,"086-1751",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","峯浜町","ミネハマチョウ",,,,,,,,,
 10327  86184100,1,1694,16940024,"086-1841",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","八木浜町","ヤギハマチョウ",,,,,,,,,
 10328  86182200,1,1694,16940025,"086-1822",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","湯ノ沢町","ユノサワチョウ",,,,,,,,,
 10329  86183400,1,1694,16940026,"086-1834",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","礼文町","レブンチョウ",,,,,,,,,
 10330  38000000,2,2201,22010000,"038-0000",0,0,"青森県","アオモリケン","青森市","アオモリシ",," ","(該当なし)",,,,,,,,
 10331  30084600,2,2201,22010001,"030-0846",0,0,"青森県","アオモリケン","青森市","アオモリシ","青葉","アオバ",,,,,,,,,
 10332  30861000,2,2201,22010001,"030-8610",1,0,"青森県","アオモリケン","青森市","アオモリシ","青葉","アオバ",,,,,,"株式会社 みちのく銀行事務センター","カブシキガイシヤ ミチノクギンコウジムセンタ−","青葉3丁目9−12",
 10333  30852000,2,2201,22010001,"030-8520",1,0,"青森県","アオモリケン","青森市","アオモリシ","青葉","アオバ",,,,,,"青森山田高等学校","アオモリヤマダコウトウガツコウ","青葉3丁目13−40",
 10334  30081100,2,2201,22010002,"030-0811",0,0,"青森県","アオモリケン","青森市","アオモリシ","青柳","アオヤギ",,,,,,,,,
 10335  30095600,2,2201,22010156,"030-0956",0,0,"青森県","アオモリケン","青森市","アオモリシ","赤坂","アカサカ",,,,,,,,,
 10336  30085100,2,2201,22010003,"030-0851",0,0,"青森県","アオモリケン","青森市","アオモリシ","旭町","アサヒチョウ",,,,,,,,,
 10337  39350100,2,2201,22010004,"039-3501",0,0,"青森県","アオモリケン","青森市","アオモリシ","浅虫","アサムシ",,,,,,,,,
 10338  38005600,2,2201,22010005,"038-0056",0,0,"青森県","アオモリケン","青森市","アオモリシ","飛鳥","アスカ",,,,,,,,,
 10339  38005900,2,2201,22010006,"038-0059",0,0,"青森県","アオモリケン","青森市","アオモリシ","油川","アブラカワ",,,,,,,,,
 10340  30011100,2,2201,22010007,"030-0111",0,0,"青森県","アオモリケン","青森市","アオモリシ","荒川","アラカワ",,,,,,,,,

10329行+ヘッダー行なので10330行目が北海道の最終行になるはずです。
しかし10329行目が最後行でした。
不要な住所データを1件とってきているみたいなのでgrep結果の末尾10件を確認してみます。

[kogure:~/test]
$ grep "北海道" zenkoku.csv | tail
86175200,1,1694,16940018,"086-1752",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","幌萌町","ホロモエチョウ",,,,,"(以下を除く 40−1、623番地)",,,,
86183300,1,1694,16940019,"086-1833",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","本町","ホンチョウ",,,,,,,,,
86183500,1,1694,16940020,"086-1835",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","松法町","マツノリチョウ",,,,,,,,,
86181400,1,1694,16940021,"086-1814",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","岬町","ミサキチョウ",,,,,,,,,
86182100,1,1694,16940022,"086-1821",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","緑町","ミドリチョウ",,,,,,,,,
86175100,1,1694,16940023,"086-1751",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","峯浜町","ミネハマチョウ",,,,,,,,,
86184100,1,1694,16940024,"086-1841",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","八木浜町","ヤギハマチョウ",,,,,,,,,
86182200,1,1694,16940025,"086-1822",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","湯ノ沢町","ユノサワチョウ",,,,,,,,,
86183400,1,1694,16940026,"086-1834",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","礼文町","レブンチョウ",,,,,,,,,
105843500,13,13103,131030019,"105-8435",1,0,"東京都","トウキョウト","港区","ミナトク","虎ノ門","トラノモン",,,,,,"北海道新聞 東京支社","ホツカイドウシンブン トウキヨウシシヤ","虎ノ門2丁目2−5",

最終行を確認すると北海道新聞 東京支社のデータが混入してしまったため想定より1件多く行数がカウントされたようです。
データを改めて確認すると北海道はダブルクォーテーションに囲まれていました。
ダブルクォーテーションを含めて改めて検索すると正しい件数が取得できました。

[kogure:~/test]
$ grep "\"北海道\"" zenkoku.csv | wc -l
   10328

[kogure:~/test]
$ grep "\"北海道\"" zenkoku.csv | tail
86184400,1,1694,16940018,"086-1844",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","幌萌町","ホロモエチョウ",,,,,"(40−1、623番地)",,,,
86175200,1,1694,16940018,"086-1752",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","幌萌町","ホロモエチョウ",,,,,"(以下を除く 40−1、623番地)",,,,
86183300,1,1694,16940019,"086-1833",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","本町","ホンチョウ",,,,,,,,,
86183500,1,1694,16940020,"086-1835",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","松法町","マツノリチョウ",,,,,,,,,
86181400,1,1694,16940021,"086-1814",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","岬町","ミサキチョウ",,,,,,,,,
86182100,1,1694,16940022,"086-1821",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","緑町","ミドリチョウ",,,,,,,,,
86175100,1,1694,16940023,"086-1751",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","峯浜町","ミネハマチョウ",,,,,,,,,
86184100,1,1694,16940024,"086-1841",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","八木浜町","ヤギハマチョウ",,,,,,,,,
86182200,1,1694,16940025,"086-1822",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","湯ノ沢町","ユノサワチョウ",,,,,,,,,
86183400,1,1694,16940026,"086-1834",0,0,"北海道","ホッカイドウ","目梨郡羅臼町","メナシグンラウスチョウ","礼文町","レブンチョウ",,,,,,,,,
さまざまな検索

先ほどの行数確認時にgrepコマンドを使用しましたがほかにもオプションがあります。 今回はよく使用していたオプションの紹介のみにとどめます。

-v :検索した文字列にヒットしなかった行を出力

[kogure:~/test]
$ grep -v "\"北海道\"" zenkoku.csv | head
"住所CD","都道府県CD","市区町村CD","町域CD","郵便番号","事業所フラグ","廃止フラグ","都道府県","都道府県カナ","市区町村","市区町村カナ","町域","町域カナ","町域補足","京都通り名","字丁目","字丁目カナ","補足","事業所名","事業所名カナ","事業所住所","新住所CD"
38000000,2,2201,22010000,"038-0000",0,0,"青森県","アオモリケン","青森市","アオモリシ",," ","(該当なし)",,,,,,,,
30084600,2,2201,22010001,"030-0846",0,0,"青森県","アオモリケン","青森市","アオモリシ","青葉","アオバ",,,,,,,,,
30861000,2,2201,22010001,"030-8610",1,0,"青森県","アオモリケン","青森市","アオモリシ","青葉","アオバ",,,,,,"株式会社 みちのく銀行事務センター","カブシキガイシヤ ミチノクギンコウジムセンタ−","青葉3丁目9−12",
30852000,2,2201,22010001,"030-8520",1,0,"青森県","アオモリケン","青森市","アオモリシ","青葉","アオバ",,,,,,"青森山田高等学校","アオモリヤマダコウトウガツコウ","青葉3丁目13−40",
30081100,2,2201,22010002,"030-0811",0,0,"青森県","アオモリケン","青森市","アオモリシ","青柳","アオヤギ",,,,,,,,,
30095600,2,2201,22010156,"030-0956",0,0,"青森県","アオモリケン","青森市","アオモリシ","赤坂","アカサカ",,,,,,,,,
30085100,2,2201,22010003,"030-0851",0,0,"青森県","アオモリケン","青森市","アオモリシ","旭町","アサヒチョウ",,,,,,,,,
39350100,2,2201,22010004,"039-3501",0,0,"青森県","アオモリケン","青森市","アオモリシ","浅虫","アサムシ",,,,,,,,,
38005600,2,2201,22010005,"038-0056",0,0,"青森県","アオモリケン","青森市","アオモリシ","飛鳥","アスカ",,,,,,,,,

北海道の行が全て取り除かれて青森から始まっていることが確認できました。

次にgrep結果の行数を確認してみたいと思います。 先ほど実行した検索結果の件数を表示するコマンドよりこちらの方がシンプルですね。

-c :検索結果の行数を表示

[kogure:~/test]
$ grep -c "\"北海道\"" zenkoku.csv
10328

他のオプションを知りたい方は下記のページを参照ください。 atmarkit.itmedia.co.jp

ファイルの差分を確認する

CSVファイルに限らずファイルの新旧差分をみたい場合があるかと思います。 その場合は下記コマンドで確認ができます。

diff <確認したいファイル1> <確認したいファイル2>

[kogure:~/test]
$ cat hoge
foo
bar
baz
qux

[kogure:~/test]
$ cat huga
foo
ber
baz

[kogure:~/test]
$ diff hoge huga
2c2
< bar
---
> ber
4d3
< qux

出力内容の「2c2」の数字部分はファイル内の行数で「c」は変更を表しています。
つまり、hogeではbarになっている箇所がhugaではberとなっていることを知らせています。

次に「4d3」では先ほどと同じように数字部分はファイル内の行数で「d」は削除を表しています。
これは4行目は削除されていて3行目が4行目に相当すること(今回は末尾行であること)を表しています。

このように1つ目に指定したファイルに対して2つ目に指定したファイルの変更点を出力してくれます。
なので比較するファイルの順序を入れ替えると削除されてるとなっていた箇所は追加されたという差分になります。

[kogure:~/test]
$ diff huga hoge
2c2
< ber
---
> bar
3a4
> qux

上記の結果では比較するファイルの順序を入れ替えたので「4d3」となっていた箇所が「3a4」となっています。
「a」は追加を表しています。これは4行目が追加されていることを表しています。

CSVファイルから特定のデータを抜き出す

awkコマンドはそれだけで技術書が出版されるほどできることが多いコマンドです。
細かく解説できるほど勉強できていないので今回実行したい内容に絞って解説します。

awkコマンドはCSVなどの行ベースのファイルを処理するのに適しているコマンドになります,。
簡単のawkコマンドの使用例は以下のようになります。

[kogure:~/test]
$ cat test
a b c
e f g

[kogure:~/test]
$ cat test  | awk '{print $0 " / " $1 " / " $2 " / " $3 }'
a b c / a / b / c
e f g / e / f / g

$0 → 行全体
$1→ 行の先頭から一つ目のスペースまで
$2 → 1つ目のスペースから2つ目のスペースまでの間の文字
$3 → 2つ目のスペースから3つ目のスペースまでの間の文字

上記のコマンドは各行の文字列全体とスペース単位の文字列を「/」で区切って出力するコマンドになります。

それではawkコマンドを使用して北海道の住所データだけを出力してみます。
北海道のデータを取りたいだけならgrepコマンドで十分じゃない?
と思うかもしれませんが、今のままではヘッダー行が取れないのでawkで取得してみたいと思います。
正規表現で頑張ればgrepでもできるかも。。。)
以下のコマンドで取得してみます。

awk -F ',' 'NR==1 || $2==1 {print $0}' zenkoku.csv > hokkaido.csv
-F ','
→フィールドの区切り文字として「,」を指定
'NR==1 || $2==1 {print $0}'
→1行目 or 都道府県コードが1のレコードを出力
> hokkaido.csv
→ 出力内容をhokkaido.csvに保存

[kogure:~/test]
$ ls -l
total 52624
-rw-r--r--  1 kogure  staff        16  1  6 22:49 hoge
-rw-r--r--  1 kogure  staff        12  1  6 22:50 huga
-rw-rw-r--  1 kogure  staff  26932648 12  4 21:48 zenkoku.csv

[kogure:~/test]
$ awk -F ',' 'NR==1 || $2==1 {print $0}' zenkoku.csv > hokkaido.csv

[kogure:~/test]
$ ls -l
total 56408
-rw-r--r--  1 kogure  staff        16  1  6 22:49 hoge
-rw-r--r--  1 kogure  staff   1935129  1  8 11:05 hokkaido.csv
-rw-r--r--  1 kogure  staff        12  1  6 22:50 huga
-rw-rw-r--  1 kogure  staff  26932648 12  4 21:48 zenkoku.csv

[kogure:~/test]
$ head hokkaido.csv
"住所CD","都道府県CD","市区町村CD","町域CD","郵便番号","事業所フラグ","廃止フラグ","都道府県","都道府県カナ","市区町村","市区町村カナ","町域","町域カナ","町域補足","京都通り名","字丁目","字丁目カナ","補足","事業所名","事業所名カナ","事業所住所","新住所CD"
64094100,1,1101,11010001,"064-0941",0,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","旭ケ丘","アサヒガオカ",,,,,,,,,
64857500,1,1101,11010001,"064-8575",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","旭ケ丘","アサヒガオカ",,,,,,"社会福祉法人 札幌慈啓会 慈啓会病院","シヤカイフクシホウジン サツポロジケイカイ ジケイカイビヨウイン","旭ケ丘5丁目6番50号",
64853500,1,1101,11010001,"064-8535",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","旭ケ丘","アサヒガオカ",,,,,,"北海道 札幌旭丘高等学校","ホツカイドウ サツポロアサヒオカコウトウガツコウ","旭ケ丘6丁目5番18号",
60000000,1,1101,11010079,"060-0000",0,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,"(790の1 )",,,,
60872100,1,1101,11010079,"060-8721",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,,"大丸 株式会社 紙包材営業本部","ダイマル カブシキガイシヤ カミホウザイエイギヨウホンブ","北3条西14丁目2番",
60855200,1,1101,11010079,"060-8552",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,,"損害保険ジャパン日本興亜 株式会社","ソンガイホケンジヤパンニツポンコウア カブシキガイシヤ","北1条西6丁目2番地損保ジャパン日本興亜札幌ビル",
60860200,1,1101,11010079,"060-8602",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,,"株式会社 朝日新聞社 北海道支社","カブシキカイシヤ アサヒシンブンシヤ ホツカイドウシシヤ","北1条西1丁目6番地さっぽろ創生スクエア9階",
60850400,1,1101,11010079,"060-8504",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,,"富士通 株式会社 北海道支社","フジツウ カブシキガイシヤ ホツカイドウシシヤ","北2条西4丁目1番地札幌三井JPビルディング",
60840600,1,1101,11010079,"060-8406",1,0,"北海道","ホッカイドウ","札幌市中央区","サッポロシチュウオウク","内橋","ウチハシ","(該当なし)",,,,,"北海道テレビ放送 株式会社","ホツカイドウテレビホウソウ カブシキカイシヤ","北1条西1丁目6番地",

上手く取れていそうですね。
念の為、サイトで配布されている北海道単体のCSV文字コードと改行コードを変換したものと比較してみます。
本来ならdiffコマンドで差分がないことを確認したかったのですが、元々のCSVの並び順が異なるため大量の差分がでてしまいました。
なので今回は行数が一致していることとファイルサイズが一致していることを確認して正しく北海道の住所データが出力できていると判断します。

[kogure:~/test]
$ ls -l
total 60200
-rw-rw-r--@ 1 kogure  staff   1935129 12  4 21:43 01hokkai.csv
-rw-r--r--  1 kogure  staff        16  1  6 22:49 hoge
-rw-r--r--  1 kogure  staff   1935129  1  8 11:05 hokkaido.csv
-rw-r--r--  1 kogure  staff        12  1  6 22:50 huga
-rw-r--r--  1 kogure  staff        12  1  8 11:23 test
-rw-rw-r--  1 kogure  staff  26932648 12  4 21:48 zenkoku.csv

[kogure:~/test]
$ wc -l hokkaido.csv
   10329 hokkaido.csv

[kogure:~/test]
$ wc -l 01hokkai.csv
   10329 01hokkai.csv

awkコマンドは以下のサイトで詳細な解説が確認できます。 様々な処理ができるのでぜひ目を通してみてください。

www.tohoho-web.com

おわりに

普段GUIツールばかり使っているのでたまにCUIで処理を行うとこっちの方が早いし楽だなと感じることもあります。 他にも便利なコマンドはあるかと思うので日々アンテナを張って業務の効率化を図っていきたいと思いました。