※当サイトの記事には、広告・プロモーションが含まれます。

Linuxで既存CSVファイルの範囲指定した行や列の内容を抽出して新規CSVファイルを作成する

japan.zdnet.com

 今回が初来日となるStaples氏は、MicrosoftAdobe、そしてNew Relicといった企業での経験を通して、これまで30年近くソフトウェア開発に携わってきたという。その中で、ソフトウェアが人々の生活を変え、豊かにするのを見てきたが、ソフトウェア開発は大変な作業だと同氏は振り返る。

複数ツールの利用が生む複雑さに対処--New RelicステイプルズCEOが語る開発者の課題 - ZDNET Japan

⇧ 30年あまりをソフトウェア開発に費やした人間の言う『ソフトウェア開発は大変な作業だと同氏は振り返る。』は説得力がありますな。

Linuxで既存CSVファイルの範囲指定した行や列の内容を抽出して新規CSVファイルを作成する方法を確認

ネットの情報を検索した限りだと、

linux.just4fun.biz

www.k-tanaka.net

⇧ 上記サイト様を参考に、行だけであれば、

  1. sed
    →開始行、終了行を指定できる。
  2. awk
    →開始行、終了行を指定できる。
  3. head
    →終了行のみ指定できる。
  4. tail
    →開始行のみ指定できる。
  5. split
    →行数の指定できる。

5パターンぐらいの方法に分かれるんだろうか。

ちなみに、

qiita.com

sedは、用途に注意した方が良い気っぽい。

で、さらに行と列となってくると、

qiita.com

minor.hatenablog.com

⇧ 複数のコマンドを組み合わせる必要があるっぽい。

既存CSVファイルの範囲指定した行数で抽出して新規CSVファイルを作成する

まずは、抽出の条件が行数のみでOKの場合。

touch [新規ファイル]
sed -n [開始行],[終了行]p [既存ファイル] > [新規ファイル]

で作成できるっぽい。

「WSL 2(Windows Subsystem for Linux 2)」のUbuntu環境で試してみる。

利用するUbuntuの環境には、

ts0818.hatenablog.com

⇧ Avahiってライブラリをインストールしてます。(ホスト名でSSH接続できるようにするため。)

まずはUbuntuを起動。

そしたらば、新しく別のコマンドプロンプトを起動し、上記で表示されてるホスト名(自分の場合ですと、「ubuntuhost」)に対してSSH接続します。

⇧ 環境は、「Ubuntu 22.04 .2 LTS(Jammy Jellyfish)」ってなってますな。

WinSCPからも接続してみる。

⇧ 接続できました。

既存CSVファイルとして利用するファイルについては、国土交通省で公開されている以下の内容を利用することにします。

nlftp.mlit.go.jp

⇧ 東京のデータをダウンロードしました。

ダウンロードできたら、WinSCPの接続先に適当なディレクトリを作成し、ダウンロードしたzipファイルを配置します。

そしたらば、コマンドプロンプト側で、unzipします。

WinSCPで展開(解凍)されたCSVファイルはヘッダー付きのようです。

とりあえず、

qiita.com

⇧ 上記サイト様を参考に、コマンドプロンプト側で「行」数と「列」数を確認してみます。

■行数を確認

wc -l [ファイルのパス]    

■列数を確認

awk -F ',' 'NR==1{print NF}' [ファイルのパス]    

⇧ 行数と列数が確認できました。

実際に、WinSCP上でファイルを開いて確認したところ、

コマンドプロンプト側で確認した内容と一緒でした。

列が670個ってことらしいんだが、

  1. MESH_ID
  2. SHICODE
  3. PTN_2015
  4. PMN_2015
  5. PFN_2015
  6. HITOKU2020
  7. GASSAN2020
  8. PTN_2020
  9. PT0_2020
  10. PT1_2020
  11. PT2_2020
  12. PT3_2020
  13. PT4_2020
  14. PT5_2020
  15. PT6_2020
  16. PT7_2020
  17. PT8_2020
  18. PT9_2020
  19. PT10_2020
  20. PT11_2020
  21. PT12_2020
  22. PT13_2020
  23. PT14_2020
  24. PT15_2020
  25. PT16_2020
  26. PT17_2020
  27. PT18_2020
  28. PT19_2020
  29. PTA_2020
  30. PTB_2020
  31. PTC_2020
  32. PTD_2020
  33. PTE_2020
  34. RTA_2020
  35. RTB_2020
  36. RTC_2020
  37. RTD_2020
  38. RTE_2020
  39. PMN_2020
  40. PM0_2020
  41. PM1_2020
  42. PM2_2020
  43. PM3_2020
  44. PM4_2020
  45. PM5_2020
  46. PM6_2020
  47. PM7_2020
  48. PM8_2020
  49. PM9_2020
  50. PM10_2020
  51. PM11_2020
  52. PM12_2020
  53. PM13_2020
  54. PM14_2020
  55. PM15_2020
  56. PM16_2020
  57. PM17_2020
  58. PM18_2020
  59. PM19_2020
  60. PMA_2020
  61. PMB_2020
  62. PMC_2020
  63. PMD_2020
  64. PME_2020
  65. RMA_2020
  66. RMB_2020
  67. RMC_2020
  68. RMD_2020
  69. RME_2020
  70. PFN_2020
  71. PF0_2020
  72. PF1_2020
  73. PF2_2020
  74. PF3_2020
  75. PF4_2020
  76. PF5_2020
  77. PF6_2020
  78. PF7_2020
  79. PF8_2020
  80. PF9_2020
  81. PF10_2020
  82. PF11_2020
  83. PF12_2020
  84. PF13_2020
  85. PF14_2020
  86. PF15_2020
  87. PF16_2020
  88. PF17_2020
  89. PF18_2020
  90. PF19_2020
  91. PFA_2020
  92. PFB_2020
  93. PFC_2020
  94. PFD_2020
  95. PFE_2020
  96. RFA_2020
  97. RFB_2020
  98. RFC_2020
  99. RFD_2020
  100. RFE_2020
  101. HITOKU2025
  102. GASSAN2025
  103. PTN_2025
  104. PT0_2025
  105. PT1_2025
  106. PT2_2025
  107. PT3_2025
  108. PT4_2025
  109. PT5_2025
  110. PT6_2025
  111. PT7_2025
  112. PT8_2025
  113. PT9_2025
  114. PT10_2025
  115. PT11_2025
  116. PT12_2025
  117. PT13_2025
  118. PT14_2025
  119. PT15_2025
  120. PT16_2025
  121. PT17_2025
  122. PT18_2025
  123. PT19_2025
  124. PTA_2025
  125. PTB_2025
  126. PTC_2025
  127. PTD_2025
  128. PTE_2025
  129. RTA_2025
  130. RTB_2025
  131. RTC_2025
  132. RTD_2025
  133. RTE_2025
  134. PMN_2025
  135. PM0_2025
  136. PM1_2025
  137. PM2_2025
  138. PM3_2025
  139. PM4_2025
  140. PM5_2025
  141. PM6_2025
  142. PM7_2025
  143. PM8_2025
  144. PM9_2025
  145. PM10_2025
  146. PM11_2025
  147. PM12_2025
  148. PM13_2025
  149. PM14_2025
  150. PM15_2025
  151. PM16_2025
  152. PM17_2025
  153. PM18_2025
  154. PM19_2025
  155. PMA_2025
  156. PMB_2025
  157. PMC_2025
  158. PMD_2025
  159. PME_2025
  160. RMA_2025
  161. RMB_2025
  162. RMC_2025
  163. RMD_2025
  164. RME_2025
  165. PFN_2025
  166. PF0_2025
  167. PF1_2025
  168. PF2_2025
  169. PF3_2025
  170. PF4_2025
  171. PF5_2025
  172. PF6_2025
  173. PF7_2025
  174. PF8_2025
  175. PF9_2025
  176. PF10_2025
  177. PF11_2025
  178. PF12_2025
  179. PF13_2025
  180. PF14_2025
  181. PF15_2025
  182. PF16_2025
  183. PF17_2025
  184. PF18_2025
  185. PF19_2025
  186. PFA_2025
  187. PFB_2025
  188. PFC_2025
  189. PFD_2025
  190. PFE_2025
  191. RFA_2025
  192. RFB_2025
  193. RFC_2025
  194. RFD_2025
  195. RFE_2025
  196. HITOKU2030
  197. GASSAN2030
  198. PTN_2030
  199. PT0_2030
  200. PT1_2030
  201. PT2_2030
  202. PT3_2030
  203. PT4_2030
  204. PT5_2030
  205. PT6_2030
  206. PT7_2030
  207. PT8_2030
  208. PT9_2030
  209. PT10_2030
  210. PT11_2030
  211. PT12_2030
  212. PT13_2030
  213. PT14_2030
  214. PT15_2030
  215. PT16_2030
  216. PT17_2030
  217. PT18_2030
  218. PT19_2030
  219. PTA_2030
  220. PTB_2030
  221. PTC_2030
  222. PTD_2030
  223. PTE_2030
  224. RTA_2030
  225. RTB_2030
  226. RTC_2030
  227. RTD_2030
  228. RTE_2030
  229. PMN_2030
  230. PM0_2030
  231. PM1_2030
  232. PM2_2030
  233. PM3_2030
  234. PM4_2030
  235. PM5_2030
  236. PM6_2030
  237. PM7_2030
  238. PM8_2030
  239. PM9_2030
  240. PM10_2030
  241. PM11_2030
  242. PM12_2030
  243. PM13_2030
  244. PM14_2030
  245. PM15_2030
  246. PM16_2030
  247. PM17_2030
  248. PM18_2030
  249. PM19_2030
  250. PMA_2030
  251. PMB_2030
  252. PMC_2030
  253. PMD_2030
  254. PME_2030
  255. RMA_2030
  256. RMB_2030
  257. RMC_2030
  258. RMD_2030
  259. RME_2030
  260. PFN_2030
  261. PF0_2030
  262. PF1_2030
  263. PF2_2030
  264. PF3_2030
  265. PF4_2030
  266. PF5_2030
  267. PF6_2030
  268. PF7_2030
  269. PF8_2030
  270. PF9_2030
  271. PF10_2030
  272. PF11_2030
  273. PF12_2030
  274. PF13_2030
  275. PF14_2030
  276. PF15_2030
  277. PF16_2030
  278. PF17_2030
  279. PF18_2030
  280. PF19_2030
  281. PFA_2030
  282. PFB_2030
  283. PFC_2030
  284. PFD_2030
  285. PFE_2030
  286. RFA_2030
  287. RFB_2030
  288. RFC_2030
  289. RFD_2030
  290. RFE_2030
  291. HITOKU2035
  292. GASSAN2035
  293. PTN_2035
  294. PT0_2035
  295. PT1_2035
  296. PT2_2035
  297. PT3_2035
  298. PT4_2035
  299. PT5_2035
  300. PT6_2035
  301. PT7_2035
  302. PT8_2035
  303. PT9_2035
  304. PT10_2035
  305. PT11_2035
  306. PT12_2035
  307. PT13_2035
  308. PT14_2035
  309. PT15_2035
  310. PT16_2035
  311. PT17_2035
  312. PT18_2035
  313. PT19_2035
  314. PTA_2035
  315. PTB_2035
  316. PTC_2035
  317. PTD_2035
  318. PTE_2035
  319. RTA_2035
  320. RTB_2035
  321. RTC_2035
  322. RTD_2035
  323. RTE_2035
  324. PMN_2035
  325. PM0_2035
  326. PM1_2035
  327. PM2_2035
  328. PM3_2035
  329. PM4_2035
  330. PM5_2035
  331. PM6_2035
  332. PM7_2035
  333. PM8_2035
  334. PM9_2035
  335. PM10_2035
  336. PM11_2035
  337. PM12_2035
  338. PM13_2035
  339. PM14_2035
  340. PM15_2035
  341. PM16_2035
  342. PM17_2035
  343. PM18_2035
  344. PM19_2035
  345. PMA_2035
  346. PMB_2035
  347. PMC_2035
  348. PMD_2035
  349. PME_2035
  350. RMA_2035
  351. RMB_2035
  352. RMC_2035
  353. RMD_2035
  354. RME_2035
  355. PFN_2035
  356. PF0_2035
  357. PF1_2035
  358. PF2_2035
  359. PF3_2035
  360. PF4_2035
  361. PF5_2035
  362. PF6_2035
  363. PF7_2035
  364. PF8_2035
  365. PF9_2035
  366. PF10_2035
  367. PF11_2035
  368. PF12_2035
  369. PF13_2035
  370. PF14_2035
  371. PF15_2035
  372. PF16_2035
  373. PF17_2035
  374. PF18_2035
  375. PF19_2035
  376. PFA_2035
  377. PFB_2035
  378. PFC_2035
  379. PFD_2035
  380. PFE_2035
  381. RFA_2035
  382. RFB_2035
  383. RFC_2035
  384. RFD_2035
  385. RFE_2035
  386. HITOKU2040
  387. GASSAN2040
  388. PTN_2040
  389. PT0_2040
  390. PT1_2040
  391. PT2_2040
  392. PT3_2040
  393. PT4_2040
  394. PT5_2040
  395. PT6_2040
  396. PT7_2040
  397. PT8_2040
  398. PT9_2040
  399. PT10_2040
  400. PT11_2040
  401. PT12_2040
  402. PT13_2040
  403. PT14_2040
  404. PT15_2040
  405. PT16_2040
  406. PT17_2040
  407. PT18_2040
  408. PT19_2040
  409. PTA_2040
  410. PTB_2040
  411. PTC_2040
  412. PTD_2040
  413. PTE_2040
  414. RTA_2040
  415. RTB_2040
  416. RTC_2040
  417. RTD_2040
  418. RTE_2040
  419. PMN_2040
  420. PM0_2040
  421. PM1_2040
  422. PM2_2040
  423. PM3_2040
  424. PM4_2040
  425. PM5_2040
  426. PM6_2040
  427. PM7_2040
  428. PM8_2040
  429. PM9_2040
  430. PM10_2040
  431. PM11_2040
  432. PM12_2040
  433. PM13_2040
  434. PM14_2040
  435. PM15_2040
  436. PM16_2040
  437. PM17_2040
  438. PM18_2040
  439. PM19_2040
  440. PMA_2040
  441. PMB_2040
  442. PMC_2040
  443. PMD_2040
  444. PME_2040
  445. RMA_2040
  446. RMB_2040
  447. RMC_2040
  448. RMD_2040
  449. RME_2040
  450. PFN_2040
  451. PF0_2040
  452. PF1_2040
  453. PF2_2040
  454. PF3_2040
  455. PF4_2040
  456. PF5_2040
  457. PF6_2040
  458. PF7_2040
  459. PF8_2040
  460. PF9_2040
  461. PF10_2040
  462. PF11_2040
  463. PF12_2040
  464. PF13_2040
  465. PF14_2040
  466. PF15_2040
  467. PF16_2040
  468. PF17_2040
  469. PF18_2040
  470. PF19_2040
  471. PFA_2040
  472. PFB_2040
  473. PFC_2040
  474. PFD_2040
  475. PFE_2040
  476. RFA_2040
  477. RFB_2040
  478. RFC_2040
  479. RFD_2040
  480. RFE_2040
  481. HITOKU2045
  482. GASSAN2045
  483. PTN_2045
  484. PT0_2045
  485. PT1_2045
  486. PT2_2045
  487. PT3_2045
  488. PT4_2045
  489. PT5_2045
  490. PT6_2045
  491. PT7_2045
  492. PT8_2045
  493. PT9_2045
  494. PT10_2045
  495. PT11_2045
  496. PT12_2045
  497. PT13_2045
  498. PT14_2045
  499. PT15_2045
  500. PT16_2045
  501. PT17_2045
  502. PT18_2045
  503. PT19_2045
  504. PTA_2045
  505. PTB_2045
  506. PTC_2045
  507. PTD_2045
  508. PTE_2045
  509. RTA_2045
  510. RTB_2045
  511. RTC_2045
  512. RTD_2045
  513. RTE_2045
  514. PMN_2045
  515. PM0_2045
  516. PM1_2045
  517. PM2_2045
  518. PM3_2045
  519. PM4_2045
  520. PM5_2045
  521. PM6_2045
  522. PM7_2045
  523. PM8_2045
  524. PM9_2045
  525. PM10_2045
  526. PM11_2045
  527. PM12_2045
  528. PM13_2045
  529. PM14_2045
  530. PM15_2045
  531. PM16_2045
  532. PM17_2045
  533. PM18_2045
  534. PM19_2045
  535. PMA_2045
  536. PMB_2045
  537. PMC_2045
  538. PMD_2045
  539. PME_2045
  540. RMA_2045
  541. RMB_2045
  542. RMC_2045
  543. RMD_2045
  544. RME_2045
  545. PFN_2045
  546. PF0_2045
  547. PF1_2045
  548. PF2_2045
  549. PF3_2045
  550. PF4_2045
  551. PF5_2045
  552. PF6_2045
  553. PF7_2045
  554. PF8_2045
  555. PF9_2045
  556. PF10_2045
  557. PF11_2045
  558. PF12_2045
  559. PF13_2045
  560. PF14_2045
  561. PF15_2045
  562. PF16_2045
  563. PF17_2045
  564. PF18_2045
  565. PF19_2045
  566. PFA_2045
  567. PFB_2045
  568. PFC_2045
  569. PFD_2045
  570. PFE_2045
  571. RFA_2045
  572. RFB_2045
  573. RFC_2045
  574. RFD_2045
  575. RFE_2045
  576. HITOKU2050
  577. GASSAN2050
  578. PTN_2050
  579. PT0_2050
  580. PT1_2050
  581. PT2_2050
  582. PT3_2050
  583. PT4_2050
  584. PT5_2050
  585. PT6_2050
  586. PT7_2050
  587. PT8_2050
  588. PT9_2050
  589. PT10_2050
  590. PT11_2050
  591. PT12_2050
  592. PT13_2050
  593. PT14_2050
  594. PT15_2050
  595. PT16_2050
  596. PT17_2050
  597. PT18_2050
  598. PT19_2050
  599. PTA_2050
  600. PTB_2050
  601. PTC_2050
  602. PTD_2050
  603. PTE_2050
  604. RTA_2050
  605. RTB_2050
  606. RTC_2050
  607. RTD_2050
  608. RTE_2050
  609. PMN_2050
  610. PM0_2050
  611. PM1_2050
  612. PM2_2050
  613. PM3_2050
  614. PM4_2050
  615. PM5_2050
  616. PM6_2050
  617. PM7_2050
  618. PM8_2050
  619. PM9_2050
  620. PM10_2050
  621. PM11_2050
  622. PM12_2050
  623. PM13_2050
  624. PM14_2050
  625. PM15_2050
  626. PM16_2050
  627. PM17_2050
  628. PM18_2050
  629. PM19_2050
  630. PMA_2050
  631. PMB_2050
  632. PMC_2050
  633. PMD_2050
  634. PME_2050
  635. RMA_2050
  636. RMB_2050
  637. RMC_2050
  638. RMD_2050
  639. RME_2050
  640. PFN_2050
  641. PF0_2050
  642. PF1_2050
  643. PF2_2050
  644. PF3_2050
  645. PF4_2050
  646. PF5_2050
  647. PF6_2050
  648. PF7_2050
  649. PF8_2050
  650. PF9_2050
  651. PF10_2050
  652. PF11_2050
  653. PF12_2050
  654. PF13_2050
  655. PF14_2050
  656. PF15_2050
  657. PF16_2050
  658. PF17_2050
  659. PF18_2050
  660. PF19_2050
  661. PFA_2050
  662. PFB_2050
  663. PFC_2050
  664. PFD_2050
  665. PFE_2050
  666. RFA_2050
  667. RFB_2050
  668. RFC_2050
  669. RFD_2050
  670. RFE_2050

⇧ 流石にCSVファイルのヘッダー行の列名(カラム名)だけ見ても、各々の列名(カラム名)の値の内容の意味が分かるわけもなく、

⇧「属性情報」として別資料のリンクでPDFが用意されていた。

用意されていたPDFの資料によると、2015年を起点として5年毎の人口の割合を2050年まで予測した値になっているようです。

残念ながら、「データ型」「固定長」「長さ」などの説明は無いので、各々の列名(カラム名)に対してどんな値が許容されるのかは不明です。

ちなみに、

CERT Secure Coding Standards は、CERT (Computer Emergency Response Team) が作成するプログラミング言語のセキュリティに関するコーディング規約群である。 現在、C言語C++Java (Oracle), PerlAndroidについて規定している。

CERT Secure Coding Standards - Wikipedia

⇧ とあり、他のプログラミング言語にも適用されるべきなのかが分からんけど、

⇧ という資料があり、インプットのチェックの重要性を上げているのだが、インプットとして許容され得る値が分からないと、チェックのしようがない気がしている...

国土交通省の認識としては、「入力のバリデーション」は意識しなくても良いってことなんですかね?

システム開発する側としては、「入力のバリデーション」したいのでインプットとして許容され得る値は把握しておきたい、というか「入力のバリデーション」できないとか怖過ぎるんだが...

だいぶ、脱線しましたが、『範囲指定した行の内容を抽出して新規ファイル』を作成してみますか。

■範囲指定した行の内容を抽出して新規ファイル

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の組み込み変数が紛らわしいんよな...

www.computerhope.com

linux.die.net

www.gnu.org

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:

https://www.gnu.org/software/gawk/manual/gawk.html

⇧ まぁ、シェルスクリプトのファイル(「.sh」ファイル)の中身を確認して、

  • awkで利用されている
    awkの「組み込み変数」
  • awk以外で利用されている
    →シェルの「位置パラメーター(positional parameter)」

⇧ って判断するしかないんかな?

まぁ、人間から見たら、同じ「$1」みたいな形だから、全く別物ってことは知ってなきゃ分からんよな...

IT系特有なのかもしらんけども、「ダブル・ミーニング(英語: double meaning)」的な罠が多過ぎるんよな...

コンテキスト(文脈)で判断しろってことなのかも知らんけど...

そもそもとして、

developer.ibm.com

⇧ 「シェル」の立ち位置が上図のような感じでありますと。

一方で、「awk」は、

AWKオーク)は、プログラミング言語の一つ。 テキストファイル、特に空白類(スペースの他、タブなど)やカンマなどで区切られたデータファイルの処理を念頭に置いた仕様となっているが、一般的なプログラミングに用いることも可能である。UNIX上で開発された。

AWK - Wikipedia

プログラミング言語の一種らしいですと。

「シェル」と「awk」の関係は、

⇧ 上図のような感じになると。

なるほど、

qiita.com

⇧ だから、上記サイト様のような「シェル」と「awk」間での値の受け渡しなどが必要になってくると。

毎度モヤモヤ感が半端ない...

今回はこのへんで。