min117の日記

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

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++