こんな感じのカンマ区切りのcsvファイルがあったとして
1列目(ヘッダ)だけをタテに表示したい。
sedでできた。こうなる。
$ cat test.csv | head -n 1 | sed -e 's/,/\'$'\n/g'
's/,/\'$'\n/g'
ではsとgの前後にシングルクオートが要るらしい。さらに改行の前にシングルクオートした$が必要ぽい。
なんでそうなるかは苦労の跡を見てもらったほうが早い。
いつでも思い出せるようにalias に入れてしまおう。
追記
いや待てよ。このほうが早いんじゃないか?
$ 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')
早かった。
カウンタ変数cntでヘッダ数をカウントしてみよう(要は番号をつけたい)
$ for i in $(cat test.csv | head -n 1 | sed -e 's/,/ /g');
> do
> echo "$cnt"
> echo "$i"
> $*1
> done
番号と合わせて1行にしたい。echoに-nオプションをつける。
$ for i in $(cat test.csv | head -n 1 | sed -e 's/,/ /g'); do echo -n $*2; echo "$i"; done
あ。カウンタの初期化忘れた。
ループの終わり(doneの後)にカウンタ初期化する。
$ for i in $(cat test.csv | head -n 1 | sed -e 's/,/ /g'); do echo -n $*3; echo "$i"; done; cnt=1
あれ?「番号」が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
うむ。
bashソースにしておくか。
$ vim myCSVheader.sh
コピペ用テキストは末尾に。
実行テスト。
うむ。
Excelの行列を入れ替えて貼り付けに近い?
headの行数を2 にしてみよう。
$ cat test.csv | head -n 2 | sed -e 's/,/\'$'\n/g'
お。これってcsv内の全ての行をタテに(列表示に)できるってことか。実用的で便利かも。
環境はmacOSのシェル。
$ uname -a
Linux(fedora)でも動いた。たぶんCentOSでもUbuntuでも動くと思う。
awkでやれるかは後で試す。
コピペ用
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