bash とか emacs とか python とか etc

bash とか emacs とか python とか etc

ファイル操作。。。ぐだぐだ

下記のようなCSVファイル

 

ファイル名:hoge.csv

(1行目:)"タイトル"

(2行目:)"日付","項目1","項目2","項目3"

(3行目:)"2020-04-23","北海道","ほげ","3,500"

(4行目:)"2020-04-24","東京都","あげ","2,323"

........

を,3行目(実際のファイルには()内の~行目とかはついてないよ)以降を抽出し,各行の先頭にユニークID(ファイル名(.csvは除く)- レコードNo(1,2,…))を付与し,hoge_new.csvファイルを生成するスクリプトを考えた。やっかいなのは,ダブルクォートと桁区切りのカンマだ。

$ awk 'BEGIN{FS=","; OFS=":"}NR>=3{print} hoge.csv | sed 's/"/@/g' | sed 's/,//g' | sed 's/@/:/g' | awk '{print $2, $4, $6, $8}' > hoge.txt
$ cat -n hoge.txt | sed 's/\t/:/g' | sed 's/ //g' > hoge.dat
$ grep -H "" hoge.dat | sed 's/\.dat//g' | awk 'BEGIN{FS=":"; OFS=","}{print $1 "-" $2, $3, $4, $5, $6} > hoge_new.csv
$ rm *.txt *.dat

 てな具合。もっとスマートにできないかなぁ・・・。

fish-shell

fishシェルをUBUNTU on WINDOWSに入れてみる。
によると,下記のようにインストールすると最新バージョンが入るようだ。
 
$ sudo apt-add-repository ppa:fish-shell/release-2
$ sudo apt-get update
$ sudo apt-get install fish
 
 
ちょっと触ってみた感じで良さげだったので,続けてみる。
 

ファイル名を各行の先頭に入れる

標記をどうするか。

例えば,下記のようなファイルがあったとして

 

$ cat hoge.txt

aaaa bbbb cccc

dddd eeee ffff

 

この2行を

hoge.txt aaaa bbbb cccc

hoge.txt dddd eeee ffff

 

にしたい。

できれば同一フォルダのファイル全てにやりたい。

まずは,ファイルひとつからやってみる。

 

ls hoge.txt | join hoge.txt

やってみる。join:オペランドがありません。

ls hoge.txt | paste - hoge.txt

1行のみ結合。

grep -H "" hoge.txt

 

hoge.txt:aaaa bbbb cccc

hoge.txt:dddd eeee ffff

どや。

これでもとのhoge.txtのフィールド区切りを「:」にしてやればOKじゃねぇ?!!

いやぁ,解決!解決!!!。半日考えてた。。。

ではまた。

 

って。解決していないよ。同一フォルダ全部やるんだよ!!

うーん。そこはスクリプト作るなりなんなりで・・・まずはやってみます。

 

bash on UBUNTU on windows と windows間のファイルのやりとり

うーん。標記のやりかた忘れてしまった。

まぁ,windowsのデスクトップにでも必要なファイルを置いておいて,bashの方からたどってcpすれば良いので,問題は無いが面倒くさい。

 

Cプラプラ

仕事で使うファイル群をシェルで処理してきたわけですが,ほかの人(ほとんどシェルを使わない人たち)にもできるようにコードを書こうと思っているこのごろ。

 

久しぶりにC++をいじってみた。

以前に比べて理解が早いような気がするが,Pythonのおかげか?

ある程度の物が仕上がったらここにアップしますね^^

 

では。勉強に戻ります。

 

フォルダ内のcsvファイル一括エンコード

何日か経つといろいろと忘れてしまう。

 

同一フォルダに入っているCSVファイルの文字コード

Shift-jisからUTF-8に一括で変換する方法を忘れてしまった。

VPSサーバーにhistoryが残っていたので,それを書いておく。

 

nkf -w --overwrite *.csv

 

ついでにsedでファイルの中身を変えたものも残す。

 

sed --in-place=dat 's/"//g' *.csv

 

ダブルコーテーションを一括で消す作業ね。

 

ファイル整理

こんにちは。

 

今日も在宅勤務しています。日曜日ですが・・・

外にも出られずモンモンとしているので,作業します。

 

今日の作業は下の表のような複数のCSVファイルをタイトルとインデックスを除いたデータのみ取り出して上下に繋げて一つのCSVファイルにします。

 

表1 加工するCSVファイル

Title                    
年月日 項目1 項目2 項目3 項目4 項目5 項目6 項目7 項目8 項目9 項目10
4月10日 a b c d e f g h i j

 

どうするか,というと

まずは,catで各ファイルを読み込んでみます。

エクセルで作成(?)したファイルなので,Shift-jis。なので,nkf -wでUTF-8に変換後にcat。すると"Title",・・\n "4月10日",・・・・と,ダブルクォーテーションが付いてしまう。

sed 's/"//g' で除去し,と思ったら,数字の千区切りの","がフィールド区切りと認識してしまうので,よろしくない。

""は残してフィールド区切りにし,奇数列を除去が良いか・・・

 sed 's/"/@/g' P03031003-200408.csv | awk 'BEGIN{FS="@"}NR>2{print}' | sed 's/,//g' | awk 'BEGIN{FS="@";OFS=","}{print $2,$4,$6,$8,$10,$12,$14,$16,$18,$20,$22,$24,$26,$28,$30}' > test.csv

で15列目までできるんだけど。かなり冗長。しかも,同一フォルダのファイル全てに一括変換できない。for i in f$.csv とか使えばできるけど面倒。パイプを区切ってひとつづつやるかなぁ・・・

なにか良いアイデアある人いたらコメねがいますm__m