awkコマンドで自分のファイル名の列を作る

■やりたいこと:ループで同じディレクトリ内にあるcsvファイルの先頭列にそのファイル名の列を作りたい。

■Macのターミナル上(Catalina)

■試したこと:
1. 組み込み変数FILENAMEを使用した。以下のコマンドはフォルダ内の.csvとつくもののファイル名が記述された一列のcsvファイルを作るコマンド。これをもとのファイルと結合させればいいと考えたがforループをうまく作れず断念。

for file in `ls *.csv `; do cat $file | awk '{print FILENAME}' $file >$file.csv ;done

for file in `ls *.csv `; do awk -F, '{A=$1;getline < "'${file}'"; print A, "," $2"," $3 "," $4 "," $5 "," $6}' test.csv > $file.csv ;done

2. ↑のようなことせずにfor file in 'ls .csv'で取得したファイル名をそのまま最初の列に入れ込めばいいのではということで試したところ成功。


for file in `ls *.csv `; do cat $file | awk -F"," '{print "'${file}'" "," $2 "," $3 "," $4 "," $5 "," $6}' >$file.csv ;done

ただ、最初の行に.csvの名前も一緒に入るので、お掃除をするため、ファイル内で.csvと見つかるところを削除した。ファイル名は.csvで保存をしていっているため、このファイルができることには、.csv.csv.csvになっている。ファイルが多くて困る人は、rm *.csvとrm *.csv.csvでお掃除してもいいかもしれない。

for file in `ls *.csv.csv `; do cat $file | awk -F"," '{gsub( ".csv", "", $0 );print $0}' > $file.csv ;done

■以下雑記
変数名を指定できずに沼にハマったので、以下は重要。

■’(バッククォートpw)もしくは$(…)で囲むことでコマンドを処理した実行結果を示すことができる
例:
DIR=$(basename $(pwd)) 
str=`echo ${DIR} | awk -F "/" '{ print $NF }'`
echo ${str}

■awkの中では、変数は「'${変数名}'」で記述する必要あり(https://hacknote.jp/archives/26155/)

この記事が気に入ったらサポートをしてみませんか?