min117の日記

初期desireもち。趣味Mac,メインFedora,仕事xp。

メルカリでHP製ProDesk400G1 SSD240Gモデル(安くても2万円相当)を6,026円で買う

Windows環境が必要になった。サーバとして使いたい。Linux常時起動サーバ上に仮想で設けてもいいけど、リソース食いすぎる。

 

低消費電力のWindows専用サーバとしてハードがほしい。

 

メルカリで探す。めっちゃ良いのがあった。

f:id:min117:20201114092758p:plain 

SSD240GB。薄型筐体で低消費電力。Corei3 3.10GHzにメモリ8GB。

 

これで12,800円は明らかに安い。

f:id:min117:20201114092806p:plainf:id:min117:20201114092810p:plain

 

まずは値段交渉。11,000円にしてもらえた。専用をつけてもらう。

f:id:min117:20201114085855p:plain f:id:min117:20201114085900p:plain

専用後の値段はさらに1,000円落としてくれて10,000円こっきり。本体に傷があるから、とのことだけど、これキズに入らないよ…(あっても全然気にならないし)。

 

ネットで探すと最低でも19,800円。やっぱメルカリ良い。

f:id:min117:20201114093316p:plain

 

即購入する。

 f:id:min117:20201114085909p:plain f:id:min117:20201114085918p:plain 

 

以前のd払いのキャンペーンでdポイントが2,274Pある。さらに、メルカリキャンペーンの還元でも1,800P持っている。

f:id:min117:20201114085933p:plain f:id:min117:20201114085922p:plain

両方使うとたったの6,026円

 

購入に進むが、ここではdポイントのチェックは外す。

f:id:min117:20201114085938p:plain f:id:min117:20201114085943p:plain

次の画面で使う。

 

「購入する」をポチる。d払いだと決済手数料が100円かかるが、これもdポイントで還元される(はず)。

f:id:min117:20201114085948p:plain f:id:min117:20201114085953p:plain

 

d払い購入画面に進んでから、使うdポイントを指定する。

f:id:min117:20201114093813p:plain f:id:min117:20201114093818p:plain

2,274ポイントあるうち期間限定ポイント分(2,029ポイント)だけを指定してを使う。

 

通常ポイント(2,274 - 2,029 = 245ポイント分)クレジットカード(dカードプリペイド)に残高として貯められる(現金に近く価値が高い)からここでは使わない。

min117.hatenablog.com

 

当初12,800円だった商品が

f:id:min117:20201114092758p:plain

最終的に6,271円になった。

f:id:min117:20201114093823p:plain f:id:min117:20201114093832p:plain

最高性能で安い。素晴らしい。

f:id:min117:20201114095316p:plain f:id:min117:20201114093843p:plain

 

 

購入の翌々日に届いた。はっや。新品並みにキレイ。

f:id:min117:20201114094616j:plain

既存のサーバ(HP Proliant N54L)よりパワフルなのに、さらに小さく省電力。

 

最高すぎ。

f:id:min117:20201114094621j:plain

 

家庭用サーバはHP製がなんだかんだいって好きだなぁ。よくできてる。

f:id:min117:20201114094625j:plain

 

 

 

 

 

python3 カンマ区切りCSVファイル内の「金額列のカンマ区切り」のみ消し去る

f:id:min117:20201108230251p:plain

例えばこんな財務データファイルがある。

irbank.net

ファイル名はSheet1a.csvで保存。

 

売上高列に続く数字は "116,861,000,000円 "

f:id:min117:20201108221123p:plain

つまり、金額がカンマで区切られてしまっている。これだとCSVの各項目(フィールド)の区切りのカンマなのか金額のカンマなのか、区別がつかない。これだと処理しづらい。

 

国税庁も「財務諸表では金額の区切りに半角文字のカンマを使うな」と注意している。

f:id:min117:20201108121648p:plain

www.e-tax.nta.go.jp

一括処理に困るのだろう。

 

vimで開いてホールドバッファ機能で無理やり直すという手はある。

:%s/\("[0-9]\{3},[0-9]\{3},[0-9]\{3} "\),/\1,/g

 

これだとなんか違う。

f:id:min117:20201108235358p:plain

数字カンマで区切られた3桁ごとにホールドしないと。

 

こうか。

:%s/\"\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3",/g

 

これだとうまくいくけど

f:id:min117:20201109000044p:plain

例えば16行目の "1,119,000,000 " は直せていない(金額カンマの数が多いから)

f:id:min117:20201108235834p:plain

数字のパターン分、手作業で繰り返してやるとうまくいく。

:%s/\"\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

:%s/\"\([0-9]\{1}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

:%s/\"\([0-9]\{2}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

 

f:id:min117:20201109000618p:plain

が、手間が多いし間違いのモト。なかなかに面倒くさい。

min117.hatenablog.com

min117.hatenablog.com

 

 

一番てっとり早く直すには、いったんExcel開いて「タブ区切りのCSV」として保存してから、金額のカンマを取り去るのが一番早いだろう。

 

しかしExcelを使うとなんか負けた気がする。シェル(bashawk)またはPython3でやりたい

 

まずはPython3で試す。pandasを使う。

>>> import pandas as pd

>>> 

>>> pytable = pd.read_csv('Sheet1a.csv', encoding="utf8")

>>> 

>>> pytable.head()

>>> 

>>> pytable.tail()

 

csvファイルをpandasのデータフレームとして読み込んだ

f:id:min117:20201108222518p:plain

これの「営業利益」列だけ、金額のカンマを取り去ってみる。

 

str.replaceメソッドを使うとできるようだ(データフレームのメソッドか?)

>>> pytable.営業利益.str.replace(',', '')

 

f:id:min117:20201108222944p:plain

note.nkmk.me

 

で、これを全ての金額列にやるにはどうするんだ?

 

for文で回せばいいように思えるが、金額ではない列もあるから、「もし金額列だったら」または「列の訂正が NNN,NNN,NNNだったら」というif文が必要になる。

 

bashで(やりたいコードの)イメージを書くとこんな感じ。

f:id:min117:20201108223547p:plain

これをPython3でやる必要がある。Python3でのfor文での回し方と、if文での正規表現のしかたを調べないといけない。あとでやる。

 

課題

・そもそもpandasのデータフレームなんだから、各列が数値データか文字列かを判定して「数値だったら一括して文字列の置き換え(金額カンマを無くす)」のような機能が(データフレームの)関数なりメソッドとしてありそうなものだ。調べる。

qiita.com

 

 

・財務諸表の金額はバカでかい。売上高で "116,861,000,000円 "てことは116億円てことだ(新自由主義が闊歩して大企業は好きなように儲けてやがる。国民は非正規ばかりで貧しくなっているわけだが)。

先ほど読み込んだデータフレームで売上高の列を表示してみると

>>> pytable.売上高

 

f:id:min117:20201108224629p:plain

全ての行で金額のカンマの数は3個ある(例えば8の行でもカンマは3個ある)。

 

営業利益の列はこう。

>>> pytable.営業利益

 

f:id:min117:20201108224713p:plain

こちらは、例えば8の行では金額のカンマは2個しかない。

つまり、列によって金額を区切るカンマが3個だったり2個だったりする。

 

先ほどの

>>> pytable.純利益.str.replace(',', '')

を使えば、3個だろうが2個だろうが一気に置き換えしてくれるけど、仮にこれを正規表現で実装しようとしたら、どうやればいいのか?

bashでやるとしたらイメージはこんな感じ?

f:id:min117:20201108225350p:plain

ダメやな。カンマの数が不定だからこれだとキャプチャできない。これも調べる必要ある。

 

CSVはシンプルだけど奥深い。実務で一番使うからだと思う。手に覚えさせて一瞬で処理できるようにしたい。

www.yoheim.net

teratail.com

gappyfacets.com

 

 ※ vimのホールドバッファ機能で数字列のカンマを全部取り去るとこうなった。

f:id:min117:20201109003552p:plain

かなり苦労はある。

 

: 17 w Sheet1b.csv

: 18 q!

: 19 %s/\"-\([0-9]\{2}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 20 %s/\"-\([0-9]\{1}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 21 %s/\"-\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 22 %s/\"-\([0-9]\{1}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 23 %s/\"-\([0-9]\{2}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 24 %s/\"-\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 25 %s/\"\([0-9]\{1}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 26 %s/\"\([0-9]\{2}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 27 %s/\"\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 28 k

: 29 %s/\"\([0-9]\{1}\),([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 30 %s/\"\([0-9]\{1}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 31 %s/\"\([0-9]\{2}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 32 %s/\"\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4",/g

: 33 %s/\"\([0-9]\{1}\),\"\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4\5",/g

: 34 %s/\"\([0-9]\{1}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4\5",/g

: 35 %s/\"\([0-9]\{2}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4\5",/g

: 36 %s/\"\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3\4\5",/g

: 37 w

: 38 %s/\"\([0-9]\{1}\),\([0-9]\{3}\).\([0-9]\{2}\) ",/"\1\2.\3",/g

: 39 %s/\"\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3",/g

: 40 %s/\"\([0-9]\{2}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3",/g

: 41 %s/\"\([0-9]\{1}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"\1\2\3",/g

: 42 %s/\"-\([0-9]\{1}\),\([0-9]\{3}\).\([0-9]\{2}\) ",/"-\1\2.\3",/g

: 43 %s/\"-\([0-9]\{1}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"-\1\2\3\4",/g

: 44 %s/\"-\([0-9]\{2}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"-\1\2\3\4",/g

: 45 %s/\"-\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"-\1\2\3\4",/g

: 46 %s/\"-\([0-9]\{3}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"-\1\2\3",/g

: 47 %s/\"-\([0-9]\{2}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"-\1\2\3",/g

: 48 %s/\"-\([0-9]\{1}\),\([0-9]\{3}\),\([0-9]\{3}\) ",/"-\1\2\3",/g

 

しかし、カンマさえ消えればあとはawkでも扱える。例えばこう。

f:id:min117:20201109003902p:plain

$ cat Sheet1b.csv | awk -F, 'BEGIN{OFS=","}{print $2,$10,$11}' | more

 

f:id:min117:20201109004042p:plain

やっぱbashawkが一番便利で最高だなぁ。

Python3で統計量(describeメソッド)もしてみる。

>>> pytable = pd.read_csv('Sheet1b.csv', encoding="utf8")

>>> 

>>> pytable.describe()

 

これは正しく動いた気がする。

f:id:min117:20201109004237p:plain

countが58997で、bashの cat | wc と同じ数字だし。

f:id:min117:20201109004357p:plain

いいぞ。手が覚えてきた。

 

 

 

 

python3 のpandasで「上場企業名,当期利益,自己資本」のカンマ区切りcsvファイルを読み込む

f:id:min117:20201107101506p:plain

前回記事に引き続き上場企業のデータを使ってcsvをいじる。

min117.hatenablog.com

 

カンマ区切りのcsvファイルを読み込んで

「上場企業名,当期利益,自己資本」だけを取り出し

カンマ区切りで出力(ファイル名はoutt5.csv)する。

 

$ cat japan-all-stock-financial-results_20180901.csv | awk -F, 'BEGIN{OFS=","}{print $2,$8,$10}' | sed -e s/\"//g | head -n 10 | tee -a outt5.csv

f:id:min117:20201107101719p:plain

例えば日本水産だと当期利益は17334百万円つまり173億3400万円。しこたま儲けている。

 

ところで、実はJupyterNotebookでもシェルコマンドが打てる。

min117.hatenablog.com

 

いま作業してるmacOSのフォルダで実行するとこうなる。

f:id:min117:20201107102728p:plain

$ ls

$ cat japan-all-stock-financial-results_20180901.csv | head -n 10

$ cat japan-all-stock-financial-results_20180901.csv | awk -F, 'BEGIN{OFS=","}{print $2,$8,$10}' | sed -e s/\"//g | head -n 10 | tee -a outt5.csv

f:id:min117:20201107101233p:plain

うむ。

これで outt5.csvができた。

$ cat outt5.csv

f:id:min117:20201107102114p:plain

今回はこれをpython3のpandasで読んでみよう、というハナシ。

 

できた。こうなる。

f:id:min117:20201107102303p:plain

 

元のcsvファイルにある50件の企業全てについて見てみよう。catの手順からやり直す

f:id:min117:20201107102817p:plain

$ cat japan-all-stock-financial-results_20180901.csv | awk -F, 'BEGIN{OFS=","}{print $2,$8,$10}' | sed -e s/\"//g | tee -a outt6.csv

f:id:min117:20201107102929p:plain

outt6.csvに保存された。

これをpython3のpandasで読み込む。

f:id:min117:20201107103201p:plain

いいね。やり方が分かってきたよ。pandasの。

f:id:min117:20201107103447p:plain

 

会社名を除いたうえで当期利益の列でソートした outt8.csv を作って食わせてみる。

f:id:min117:20201107130452p:plain

 

統計量を出してみる。

f:id:min117:20201107130621p:plain

mean(平均)、median(中央値)まではちゃんと出た。mode(最頻値)が出ないのはなぜ?後で調べる。

 

散布図(scatter)を出力してみる。

pytable8.describe() #descriveメソッドで各列ごとの要約統計量を取得
plt.scatter(pytable8['当期利益(百万円)'], pytable8['自己資本(百万円)'])
# plt.xlim([0,100000]) #横軸xの下限を「0」、上限を「100000」
plt.xlim([0,45000])
plt.ylabel('JIKO_SIHON') #縦軸ラベル
plt.xlabel('TOUKI_RIEKI') #「縦軸ラベル
plt.show() #コードの実行結果の表示

f:id:min117:20201107130736p:plain

グラフ右上に1つだけ、ヘンに右上に吹っ飛んだのがいる。

 

国際石油開発帝石」だ。当期利益が40362、自己資本が2916680もある。他と1ケタ違う。

f:id:min117:20201107131043p:plain

外資か何かか?政府の天下り先?税金入ってるから?

あとで調べる。

 

別のcsvで実験。

http://lkzf.info/xbrl/data/summary-join.csv

f:id:min117:20201107135049p:plain

f:id:min117:20201107135031p:plain

 

コピペ用

#https://qiita.com/mabota/items/a68b400cb1a2ea6ad71a
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
#インライン宣言
%matplotlib inline

pytable = 0 #変数の中身ゼロクリア

pytable = pd.read_csv('outt5.csv', encoding="utf8")
# print(pytable)
pytable.head()

 

qiita.com

 

qiita.com

 

 

 

 

awk (入力じゃなくて)出力の区切り文字を指定する(カンマ区切りで各フィールドを出力したい)

f:id:min117:20201107095548p:plain

bashawk、python3でcsvファイルを自由自在にしたい。都度調べるのがダルいので手に覚えさせる

 

サンプルcsvはこれ。上場企業の当期利益と資本金を一覧にしてみる。

hesonogoma.com

 

とりあえずアタマの50件だけダウンロード。

f:id:min117:20201107093612p:plain

 

$ cat japan-all-stock-financial-results_20180901.csv | wc

f:id:min117:20201107093703p:plain

 

$ vim japan-all-stock-financial-results_20180901.csv

f:id:min117:20201107093246p:plain

 

「名称」「当期利益」「自己資本」だけ取り出してみる。

cat japan-all-stock-financial-results_20180901.csv | awk -F, '{print $2,$8,$10}'

f:id:min117:20201107093856p:plain

石油会社やら建設会社やら多いなぁ。コロナ禍でもシコタマ儲けてやがる。

 

ダブルクオートがウザいのでsedで取り払う

cat japan-all-stock-financial-results_20180901.csv | awk -F, '{print $2,$8,$10}' | sed -e s/\"//g

f:id:min117:20201107094532p:plain

うむ。

 

さて、 awk -F, '{print $2,$8,$10}'  でprintしたので各項目の区切り文字が空白になってしまっている。

f:id:min117:20201107094901p:plain

awkのprint文では、各フィールドをカンマで区切る出力は空白になる仕様だから。紛らわしいが慣れるしかない。

 

で。これをカンマ区切りにして出力したい。つまりこうしたい

f:id:min117:20201107095129p:plain

こうやる。

cat japan-all-stock-financial-results_20180901.csv | awk -F, 'BEGIN{OFS=","}{print $2,$8,$10}' | sed -e s/\"//g 

f:id:min117:20201107095312p:plain

BEGIN{} の中でawkで使うOFSをカンマに指定してやればOK。

 

it-ojisan.tokyo

f:id:min117:20201107095426p:plain

 

これと同じことをbashでもできるみたい。

f:id:min117:20201107095824p:plain

 

応用の幅が広そう。次回試す。

www.shell-tips.com

 

 

 

 

 

bash カンマ区切りのcsvを1列目でソートする sort -t, -k1n

f:id:min117:20201107082912j:plain

 

bashカンマ区切りのCSV1列目でソートしたい。こんなcsv

f:id:min117:20201107081724p:plain

こうやる。

$ cat outt3.txt | sort -t, -k1n

-t, 区切り文字はカンマ,だよ

-k1 キーが1列目である

-k1n キーが1列目である かつ それを数字(n)としてソートする

 

genzouw.com

 

こうなる。

f:id:min117:20201107082013p:plain

f:id:min117:20201107082128p:plain

末尾(最大値)は2600000である。

 

-k1nを忘れるとこうなってしまう。最大値が99950になってしまっている。

f:id:min117:20201107082227p:plain

これは

 2600000の頭文字2より

 99950の頭文字9のほうが大きい

bashが勘違いしてしまっている。

つまり数字としてみていない(文字として比べてしまっている)から。

nを付けることで数字としてみてくれるようになる。忘れがち。

 

しばらくcsvファイルにハマる。bashpythonでいじり倒すつもり。

 

orebibou.com

 

www.shell-tips.com

 

free-designer.net

 

www.flyenginer.com

 

 

 

 

 

Python3 正規表現のグラフを描く

偏差が平均との差であること、

その差を二乗したもの(正負反転)が分散であること、

二乗を元に戻すためにルートを取ったものが標準偏差であること、

は分かった。

 

あとはPythonに実データを食わせて標準偏差をとって正規分布になるか確認してみたい。

 

まずは形から入る。ここのコードそのまま使わせてもらおう。

www.python.ambitious-engineer.com

 

まんま写経する。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
import numpy as np
from scipy.stats import norm
import matplotlib.pyplot as plt
 
# 平均
loc = 10
# 標準偏差
scale = 10
 
# 左端(平均-5*σ)
start = loc - scale * 5
 
# 右端(平均+5*σ)
end = loc + scale * 5
 
# X軸
X = np.arange(start, end, 0.1)
# 正規分布pdf生成
Y = norm.pdf(X, loc=loc, scale=scale)
 
# プロットする
fig = plt.figure()
ax = fig.add_subplot(1, 1, 1)
ax.grid(color='gray')
ax.plot(X, Y, color='blue')
plt.show()

 

Jupyter Notebookで実行。

f:id:min117:20201106062718p:plain

おお。

 

macOSからssh -XCした先のfedoraでも実行してみる。XQuartzで表示できる。

$ vim my_norm01.py

f:id:min117:20201106063231p:plain

 

python3 my_norm01.py

 

 

sed ヘッダ行だけをタテに表示する (Excelの行列を入れ替えて貼り付け)

こんな感じのカンマ区切りのcsvファイルがあったとして

$ vim test.csv

f:id:min117:20201103075350p:plain

1列目(ヘッダ)だけをタテに表示したい。

 

sedできた。こうなる。

$ cat test.csv | head -n 1 | sed -e 's/,/\'$'\n/g'

f:id:min117:20201103075633p:plain

's/,/\'$'\n/g'

ではsとgの前後にシングルクオートが要るらしい。さらに改行の前にシングルクオートした$が必要ぽい。

qiita.com

なんでそうなるかは苦労の跡を見てもらったほうが早い

f:id:min117:20201108094518p:plain

いつでも思い出せるようにalias に入れてしまおう。

f:id:min117:20201108093740p:plain

 

追記

いや待てよ。このほうが早いんじゃないか?

 

$ for i in $(cat test.csv | head -n 1 | sed -e 's/,/ /g')

> do

> echo "$i"

> done

 

$ for i in $(cat test.csv | head -n 1 | sed -e 's/,/ /g')

f:id:min117:20201108102611p:plain
早かった。

 

カウンタ変数cntでヘッダ数をカウントしてみよう(要は番号をつけたい)

$ for i in $(cat test.csv | head -n 1 | sed -e 's/,/ /g'); 

> do

> echo "$cnt"

> echo "$i"

> $*1

> done

 

f:id:min117:20201108103112p:plain

 

番号と合わせて1行にしたい。echoに-nオプションをつける。

$ for i in $(cat test.csv | head -n 1 | sed -e 's/,/ /g'); do echo -n $*2; echo "$i"; done

 

f:id:min117:20201108103224p:plain

あ。カウンタの初期化忘れた。

 

ループの終わり(doneの後)にカウンタ初期化する。

$ for i in $(cat test.csv | head -n 1 | sed -e 's/,/ /g'); do echo -n $*3; echo "$i"; done; cnt=1

 

f:id:min117:20201108103730p:plain

あれ?「番号」が0で始まっちゃってる。$((cnt++)) は先に足して後から表示するらしい。

 

cntをゼロから始めてみる。

$ for i in $(cat test.csv | head -n 1 | sed -e 's/,/ /g'); do echo -n $*4; echo "$i"; done; cnt=0

 

f:id:min117:20201108103609p:plain

うむ。

 

bashソースにしておくか。

$ vim myCSVheader.sh

f:id:min117:20201108105610p:plain

コピペ用テキストは末尾に。

 

実行テスト。

f:id:min117:20201108105708p:plain

うむ。

 

Excel行列を入れ替えて貼り付けに近い?

f:id:min117:20201103080909p:plain

 

headの行数を2 にしてみよう。

$ cat test.csv | head -n 2 | sed -e 's/,/\'$'\n/g'

f:id:min117:20201103080436p:plain

お。これってcsv内の全ての行をタテに(列表示に)できるってことか。実用的で便利かも。

 

環境はmacOSのシェル。

$ uname -a

f:id:min117:20201103080050p:plain

Linuxfedora)でも動いた。たぶんCentOSでもUbuntuでも動くと思う。

f:id:min117:20201103081810p:plain

 

awkでやれるかは後で試す。

it-ojisan.tokyo

 

コピペ用

  1 #!/bin/bash

  2 

  3 shopt -s expand_aliases

  4 source ~/.bashrc

  5 

  6 # shopt について

  7 # https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Bui    ltin.html

  8 

  9 # 異常時にちゃんと止まるスクリプト

 10 # http://fj.hatenablog.jp/entry/2017/05/20/192431

 11 #set -eu -o pipefail

 12 #trap 'echo "ERROR: line no = $LINENO, exit status = $? > &2; exit     1' ERR

 13 

 14 mydate=`date +"%Y%m%d_%H%M%S"`

 15 mypath=`pwd`

 16 

 17 echo $mydate

 18 

 19 

 20 if [ $# -lt 1 ]

 21 then

 22     echo '引数足りない'

 23     echo '--------------------------'

 24     echo "$0" 'test.csv'

 25     echo '--------------------------'

 26     exit

 27 fi

 28 

 29 ### csvのヘッダ列だけ番号付きで表示する

 30 # http://min117.hatenablog.com/entry/2020/11/03/082224?_ga=2.52015    657.1639501078.1604699939-1109097613.1601855526

 31 

 32 cnt=1

 33 for i in $(cat "$1" | head -n 1 | sed -e 's/,/ /g')

 34 do

 35     echo -n $*5

 36     echo -n ' '

 37     echo "$i"

 38 done

 39 

 40 

 

 

 

 

 

*1:cnt++

*2:cnt++

*3:cnt++

*4:cnt++

*5:cnt++