今回が初来日となるStaples氏は、MicrosoftやAdobe、そしてNew Relicといった企業での経験を通して、これまで30年近くソフトウェア開発に携わってきたという。その中で、ソフトウェアが人々の生活を変え、豊かにするのを見てきたが、ソフトウェア開発は大変な作業だと同氏は振り返る。
複数ツールの利用が生む複雑さに対処--New RelicステイプルズCEOが語る開発者の課題 - ZDNET Japan
⇧ 30年あまりをソフトウェア開発に費やした人間の言う『ソフトウェア開発は大変な作業だと同氏は振り返る。』は説得力がありますな。
Linuxで既存CSVファイルの範囲指定した行や列の内容を抽出して新規CSVファイルを作成する方法を確認
ネットの情報を検索した限りだと、
⇧ 上記サイト様を参考に、行だけであれば、
5パターンぐらいの方法に分かれるんだろうか。
ちなみに、
⇧ sedは、用途に注意した方が良い気っぽい。
で、さらに行と列となってくると、
⇧ 複数のコマンドを組み合わせる必要があるっぽい。
既存CSVファイルの範囲指定した行数で抽出して新規CSVファイルを作成する
まずは、抽出の条件が行数のみでOKの場合。
touch [新規ファイル]
sed -n [開始行],[終了行]p [既存ファイル] > [新規ファイル]
で作成できるっぽい。
「WSL 2(Windows Subsystem for Linux 2)」のUbuntu環境で試してみる。
利用するUbuntuの環境には、
⇧ Avahiってライブラリをインストールしてます。(ホスト名でSSH接続できるようにするため。)
まずはUbuntuを起動。
そしたらば、新しく別のコマンドプロンプトを起動し、上記で表示されてるホスト名(自分の場合ですと、「ubuntuhost」)に対してSSH接続します。
⇧ 環境は、「Ubuntu 22.04 .2 LTS(Jammy Jellyfish)」ってなってますな。
WinSCPからも接続してみる。
⇧ 接続できました。
既存CSVファイルとして利用するファイルについては、国土交通省で公開されている以下の内容を利用することにします。
⇧ 東京のデータをダウンロードしました。
ダウンロードできたら、WinSCPの接続先に適当なディレクトリを作成し、ダウンロードしたzipファイルを配置します。
そしたらば、コマンドプロンプト側で、unzipします。
WinSCPで展開(解凍)されたCSVファイルはヘッダー付きのようです。
とりあえず、
⇧ 上記サイト様を参考に、コマンドプロンプト側で「行」数と「列」数を確認してみます。
■行数を確認
wc -l [ファイルのパス]
■列数を確認
awk -F ',' 'NR==1{print NF}' [ファイルのパス]
⇧ 行数と列数が確認できました。
実際に、WinSCP上でファイルを開いて確認したところ、
⇧ コマンドプロンプト側で確認した内容と一緒でした。
列が670個ってことらしいんだが、
- MESH_ID
- SHICODE
- PTN_2015
- PMN_2015
- PFN_2015
- HITOKU2020
- GASSAN2020
- PTN_2020
- PT0_2020
- PT1_2020
- PT2_2020
- PT3_2020
- PT4_2020
- PT5_2020
- PT6_2020
- PT7_2020
- PT8_2020
- PT9_2020
- PT10_2020
- PT11_2020
- PT12_2020
- PT13_2020
- PT14_2020
- PT15_2020
- PT16_2020
- PT17_2020
- PT18_2020
- PT19_2020
- PTA_2020
- PTB_2020
- PTC_2020
- PTD_2020
- PTE_2020
- RTA_2020
- RTB_2020
- RTC_2020
- RTD_2020
- RTE_2020
- PMN_2020
- PM0_2020
- PM1_2020
- PM2_2020
- PM3_2020
- PM4_2020
- PM5_2020
- PM6_2020
- PM7_2020
- PM8_2020
- PM9_2020
- PM10_2020
- PM11_2020
- PM12_2020
- PM13_2020
- PM14_2020
- PM15_2020
- PM16_2020
- PM17_2020
- PM18_2020
- PM19_2020
- PMA_2020
- PMB_2020
- PMC_2020
- PMD_2020
- PME_2020
- RMA_2020
- RMB_2020
- RMC_2020
- RMD_2020
- RME_2020
- PFN_2020
- PF0_2020
- PF1_2020
- PF2_2020
- PF3_2020
- PF4_2020
- PF5_2020
- PF6_2020
- PF7_2020
- PF8_2020
- PF9_2020
- PF10_2020
- PF11_2020
- PF12_2020
- PF13_2020
- PF14_2020
- PF15_2020
- PF16_2020
- PF17_2020
- PF18_2020
- PF19_2020
- PFA_2020
- PFB_2020
- PFC_2020
- PFD_2020
- PFE_2020
- RFA_2020
- RFB_2020
- RFC_2020
- RFD_2020
- RFE_2020
- HITOKU2025
- GASSAN2025
- PTN_2025
- PT0_2025
- PT1_2025
- PT2_2025
- PT3_2025
- PT4_2025
- PT5_2025
- PT6_2025
- PT7_2025
- PT8_2025
- PT9_2025
- PT10_2025
- PT11_2025
- PT12_2025
- PT13_2025
- PT14_2025
- PT15_2025
- PT16_2025
- PT17_2025
- PT18_2025
- PT19_2025
- PTA_2025
- PTB_2025
- PTC_2025
- PTD_2025
- PTE_2025
- RTA_2025
- RTB_2025
- RTC_2025
- RTD_2025
- RTE_2025
- PMN_2025
- PM0_2025
- PM1_2025
- PM2_2025
- PM3_2025
- PM4_2025
- PM5_2025
- PM6_2025
- PM7_2025
- PM8_2025
- PM9_2025
- PM10_2025
- PM11_2025
- PM12_2025
- PM13_2025
- PM14_2025
- PM15_2025
- PM16_2025
- PM17_2025
- PM18_2025
- PM19_2025
- PMA_2025
- PMB_2025
- PMC_2025
- PMD_2025
- PME_2025
- RMA_2025
- RMB_2025
- RMC_2025
- RMD_2025
- RME_2025
- PFN_2025
- PF0_2025
- PF1_2025
- PF2_2025
- PF3_2025
- PF4_2025
- PF5_2025
- PF6_2025
- PF7_2025
- PF8_2025
- PF9_2025
- PF10_2025
- PF11_2025
- PF12_2025
- PF13_2025
- PF14_2025
- PF15_2025
- PF16_2025
- PF17_2025
- PF18_2025
- PF19_2025
- PFA_2025
- PFB_2025
- PFC_2025
- PFD_2025
- PFE_2025
- RFA_2025
- RFB_2025
- RFC_2025
- RFD_2025
- RFE_2025
- HITOKU2030
- GASSAN2030
- PTN_2030
- PT0_2030
- PT1_2030
- PT2_2030
- PT3_2030
- PT4_2030
- PT5_2030
- PT6_2030
- PT7_2030
- PT8_2030
- PT9_2030
- PT10_2030
- PT11_2030
- PT12_2030
- PT13_2030
- PT14_2030
- PT15_2030
- PT16_2030
- PT17_2030
- PT18_2030
- PT19_2030
- PTA_2030
- PTB_2030
- PTC_2030
- PTD_2030
- PTE_2030
- RTA_2030
- RTB_2030
- RTC_2030
- RTD_2030
- RTE_2030
- PMN_2030
- PM0_2030
- PM1_2030
- PM2_2030
- PM3_2030
- PM4_2030
- PM5_2030
- PM6_2030
- PM7_2030
- PM8_2030
- PM9_2030
- PM10_2030
- PM11_2030
- PM12_2030
- PM13_2030
- PM14_2030
- PM15_2030
- PM16_2030
- PM17_2030
- PM18_2030
- PM19_2030
- PMA_2030
- PMB_2030
- PMC_2030
- PMD_2030
- PME_2030
- RMA_2030
- RMB_2030
- RMC_2030
- RMD_2030
- RME_2030
- PFN_2030
- PF0_2030
- PF1_2030
- PF2_2030
- PF3_2030
- PF4_2030
- PF5_2030
- PF6_2030
- PF7_2030
- PF8_2030
- PF9_2030
- PF10_2030
- PF11_2030
- PF12_2030
- PF13_2030
- PF14_2030
- PF15_2030
- PF16_2030
- PF17_2030
- PF18_2030
- PF19_2030
- PFA_2030
- PFB_2030
- PFC_2030
- PFD_2030
- PFE_2030
- RFA_2030
- RFB_2030
- RFC_2030
- RFD_2030
- RFE_2030
- HITOKU2035
- GASSAN2035
- PTN_2035
- PT0_2035
- PT1_2035
- PT2_2035
- PT3_2035
- PT4_2035
- PT5_2035
- PT6_2035
- PT7_2035
- PT8_2035
- PT9_2035
- PT10_2035
- PT11_2035
- PT12_2035
- PT13_2035
- PT14_2035
- PT15_2035
- PT16_2035
- PT17_2035
- PT18_2035
- PT19_2035
- PTA_2035
- PTB_2035
- PTC_2035
- PTD_2035
- PTE_2035
- RTA_2035
- RTB_2035
- RTC_2035
- RTD_2035
- RTE_2035
- PMN_2035
- PM0_2035
- PM1_2035
- PM2_2035
- PM3_2035
- PM4_2035
- PM5_2035
- PM6_2035
- PM7_2035
- PM8_2035
- PM9_2035
- PM10_2035
- PM11_2035
- PM12_2035
- PM13_2035
- PM14_2035
- PM15_2035
- PM16_2035
- PM17_2035
- PM18_2035
- PM19_2035
- PMA_2035
- PMB_2035
- PMC_2035
- PMD_2035
- PME_2035
- RMA_2035
- RMB_2035
- RMC_2035
- RMD_2035
- RME_2035
- PFN_2035
- PF0_2035
- PF1_2035
- PF2_2035
- PF3_2035
- PF4_2035
- PF5_2035
- PF6_2035
- PF7_2035
- PF8_2035
- PF9_2035
- PF10_2035
- PF11_2035
- PF12_2035
- PF13_2035
- PF14_2035
- PF15_2035
- PF16_2035
- PF17_2035
- PF18_2035
- PF19_2035
- PFA_2035
- PFB_2035
- PFC_2035
- PFD_2035
- PFE_2035
- RFA_2035
- RFB_2035
- RFC_2035
- RFD_2035
- RFE_2035
- HITOKU2040
- GASSAN2040
- PTN_2040
- PT0_2040
- PT1_2040
- PT2_2040
- PT3_2040
- PT4_2040
- PT5_2040
- PT6_2040
- PT7_2040
- PT8_2040
- PT9_2040
- PT10_2040
- PT11_2040
- PT12_2040
- PT13_2040
- PT14_2040
- PT15_2040
- PT16_2040
- PT17_2040
- PT18_2040
- PT19_2040
- PTA_2040
- PTB_2040
- PTC_2040
- PTD_2040
- PTE_2040
- RTA_2040
- RTB_2040
- RTC_2040
- RTD_2040
- RTE_2040
- PMN_2040
- PM0_2040
- PM1_2040
- PM2_2040
- PM3_2040
- PM4_2040
- PM5_2040
- PM6_2040
- PM7_2040
- PM8_2040
- PM9_2040
- PM10_2040
- PM11_2040
- PM12_2040
- PM13_2040
- PM14_2040
- PM15_2040
- PM16_2040
- PM17_2040
- PM18_2040
- PM19_2040
- PMA_2040
- PMB_2040
- PMC_2040
- PMD_2040
- PME_2040
- RMA_2040
- RMB_2040
- RMC_2040
- RMD_2040
- RME_2040
- PFN_2040
- PF0_2040
- PF1_2040
- PF2_2040
- PF3_2040
- PF4_2040
- PF5_2040
- PF6_2040
- PF7_2040
- PF8_2040
- PF9_2040
- PF10_2040
- PF11_2040
- PF12_2040
- PF13_2040
- PF14_2040
- PF15_2040
- PF16_2040
- PF17_2040
- PF18_2040
- PF19_2040
- PFA_2040
- PFB_2040
- PFC_2040
- PFD_2040
- PFE_2040
- RFA_2040
- RFB_2040
- RFC_2040
- RFD_2040
- RFE_2040
- HITOKU2045
- GASSAN2045
- PTN_2045
- PT0_2045
- PT1_2045
- PT2_2045
- PT3_2045
- PT4_2045
- PT5_2045
- PT6_2045
- PT7_2045
- PT8_2045
- PT9_2045
- PT10_2045
- PT11_2045
- PT12_2045
- PT13_2045
- PT14_2045
- PT15_2045
- PT16_2045
- PT17_2045
- PT18_2045
- PT19_2045
- PTA_2045
- PTB_2045
- PTC_2045
- PTD_2045
- PTE_2045
- RTA_2045
- RTB_2045
- RTC_2045
- RTD_2045
- RTE_2045
- PMN_2045
- PM0_2045
- PM1_2045
- PM2_2045
- PM3_2045
- PM4_2045
- PM5_2045
- PM6_2045
- PM7_2045
- PM8_2045
- PM9_2045
- PM10_2045
- PM11_2045
- PM12_2045
- PM13_2045
- PM14_2045
- PM15_2045
- PM16_2045
- PM17_2045
- PM18_2045
- PM19_2045
- PMA_2045
- PMB_2045
- PMC_2045
- PMD_2045
- PME_2045
- RMA_2045
- RMB_2045
- RMC_2045
- RMD_2045
- RME_2045
- PFN_2045
- PF0_2045
- PF1_2045
- PF2_2045
- PF3_2045
- PF4_2045
- PF5_2045
- PF6_2045
- PF7_2045
- PF8_2045
- PF9_2045
- PF10_2045
- PF11_2045
- PF12_2045
- PF13_2045
- PF14_2045
- PF15_2045
- PF16_2045
- PF17_2045
- PF18_2045
- PF19_2045
- PFA_2045
- PFB_2045
- PFC_2045
- PFD_2045
- PFE_2045
- RFA_2045
- RFB_2045
- RFC_2045
- RFD_2045
- RFE_2045
- HITOKU2050
- GASSAN2050
- PTN_2050
- PT0_2050
- PT1_2050
- PT2_2050
- PT3_2050
- PT4_2050
- PT5_2050
- PT6_2050
- PT7_2050
- PT8_2050
- PT9_2050
- PT10_2050
- PT11_2050
- PT12_2050
- PT13_2050
- PT14_2050
- PT15_2050
- PT16_2050
- PT17_2050
- PT18_2050
- PT19_2050
- PTA_2050
- PTB_2050
- PTC_2050
- PTD_2050
- PTE_2050
- RTA_2050
- RTB_2050
- RTC_2050
- RTD_2050
- RTE_2050
- PMN_2050
- PM0_2050
- PM1_2050
- PM2_2050
- PM3_2050
- PM4_2050
- PM5_2050
- PM6_2050
- PM7_2050
- PM8_2050
- PM9_2050
- PM10_2050
- PM11_2050
- PM12_2050
- PM13_2050
- PM14_2050
- PM15_2050
- PM16_2050
- PM17_2050
- PM18_2050
- PM19_2050
- PMA_2050
- PMB_2050
- PMC_2050
- PMD_2050
- PME_2050
- RMA_2050
- RMB_2050
- RMC_2050
- RMD_2050
- RME_2050
- PFN_2050
- PF0_2050
- PF1_2050
- PF2_2050
- PF3_2050
- PF4_2050
- PF5_2050
- PF6_2050
- PF7_2050
- PF8_2050
- PF9_2050
- PF10_2050
- PF11_2050
- PF12_2050
- PF13_2050
- PF14_2050
- PF15_2050
- PF16_2050
- PF17_2050
- PF18_2050
- PF19_2050
- PFA_2050
- PFB_2050
- PFC_2050
- PFD_2050
- PFE_2050
- RFA_2050
- RFB_2050
- RFC_2050
- RFD_2050
- RFE_2050
⇧ 流石にCSVファイルのヘッダー行の列名(カラム名)だけ見ても、各々の列名(カラム名)の値の内容の意味が分かるわけもなく、
⇧「属性情報」として別資料のリンクでPDFが用意されていた。
用意されていたPDFの資料によると、2015年を起点として5年毎の人口の割合を2050年まで予測した値になっているようです。
残念ながら、「データ型」「固定長」「長さ」などの説明は無いので、各々の列名(カラム名)に対してどんな値が許容されるのかは不明です。
ちなみに、
CERT Secure Coding Standards は、CERT (Computer Emergency Response Team) が作成するプログラミング言語のセキュリティに関するコーディング規約群である。 現在、C言語, C++, Java (Oracle), Perl, Androidについて規定している。
⇧ とあり、他のプログラミング言語にも適用されるべきなのかが分からんけど、
⇧ という資料があり、インプットのチェックの重要性を上げているのだが、インプットとして許容され得る値が分からないと、チェックのしようがない気がしている...
国土交通省の認識としては、「入力のバリデーション」は意識しなくても良いってことなんですかね?
システム開発する側としては、「入力のバリデーション」したいのでインプットとして許容され得る値は把握しておきたい、というか「入力のバリデーション」できないとか怖過ぎるんだが...
だいぶ、脱線しましたが、『範囲指定した行の内容を抽出して新規ファイル』を作成してみますか。
■範囲指定した行の内容を抽出して新規ファイル
touch test_range_row.csv
sed -n 1,1000p 500m_mesh_suikei_2018_csv_13.csv > test_range_row.csv
⇧ 確認すると、新規ファイルの行数が1000行になってるので、問題ないかと。既存ファイルが変更されていないことも確認。
既存CSVファイルの範囲指定した列を抽出して新規CSVファイルを作成する
今度は列の抽出を試してみる。
■範囲指定した列の内容を抽出して新規ファイル
touch test_range_col.csv
awk -F ',' '{print $3}' 500m_mesh_suikei_2018_csv_13.csv > test_range_col.csv
⇧ 新規ファイルが1列だけ抽出した内容になっていることを確認。
複数列を抽出の場合は、試していないので、参考サイト様を参照くださいませ。
既存CSVファイルの範囲指定した列と行を抽出して新規CSVファイルを作成する
最後に列と行の抽出を試してみる。
■範囲指定した列と行の内容を抽出して新規ファイル
test_range_col_and_row.csv
awk -F ',' '{print $3}' 500m_mesh_suikei_2018_csv_13.csv | sed -n 1,1000p > test_range_col_and_row.csv
⇧ という感じになりました。
いずれも、抽出する元となる既存ファイルを変化させることは無いってことなんですね。
cutコマンドについても、
⇧ 抽出する元となる既存ファイルを変化させることは無いってことが確認できました。
ファイルの中身も一応確認してみます。(1列のみ抽出したファイルだけ)
⇧ 抽出できていそうです。
抽出するとか切り出すとかって聞くと、元のファイルが変化するんじゃないかって思ってしまうのは、私だけでしょうか...
まぁ、何らかの作業する際は、バックアップは取っておいた方が良い気はする。
シェルの「位置パラメーター(positional parameter)」とawkの「組み込み変数」が紛らわしいという話
シェルスクリプトのファイル(「.sh」ファイル)を実行時の引数である「位置パラメーター(positional parameter)」とawkの組み込み変数が紛らわしいんよな...
You use a dollar sign (‘$’) to refer to a field in an awk
program, followed by the number of the field you want. Thus, $1
refers to the first field, $2
to the second, and so on. (Unlike in the Unix shells, the field numbers are not limited to single digits. $127
is the 127th field in the record.) For example, suppose the following is a line of input:
⇧ まぁ、シェルスクリプトのファイル(「.sh」ファイル)の中身を確認して、
⇧ って判断するしかないんかな?
まぁ、人間から見たら、同じ「$1」みたいな形だから、全く別物ってことは知ってなきゃ分からんよな...
IT系特有なのかもしらんけども、「ダブル・ミーニング(英語: double meaning)」的な罠が多過ぎるんよな...
コンテキスト(文脈)で判断しろってことなのかも知らんけど...
そもそもとして、
⇧ 「シェル」の立ち位置が上図のような感じでありますと。
一方で、「awk」は、
AWK(オーク)は、プログラミング言語の一つ。 テキストファイル、特に空白類(スペースの他、タブなど)やカンマなどで区切られたデータファイルの処理を念頭に置いた仕様となっているが、一般的なプログラミングに用いることも可能である。UNIX上で開発された。
⇧ プログラミング言語の一種らしいですと。
「シェル」と「awk」の関係は、
⇧ 上図のような感じになると。
なるほど、
⇧ だから、上記サイト様のような「シェル」と「awk」間での値の受け渡しなどが必要になってくると。
毎度モヤモヤ感が半端ない...
今回はこのへんで。