bashを使用して特定の列に日付を出力する

bashを使用して特定の列に日付を出力する

bashスクリプトを使用してヘッダーを無視し、日付をcsv列に出力したいと思います。私はこれを持っていますが、特定の列に入れるのではなく、短縮された曜日だけを提供します。

date | awk '{print $1}' >> date.csv

以下は、コマンドの実行後に必要なCSVです。

bash_script1,bash_script2,bash_script3
Thu Mar  2 03:11:01 EST 2023,Tue Mar 21 05:39:01 EDT 2023,Thu Mar  2 04:19:01 EST 2023
Thu Mar  2 04:19:01 EST 2023,Tue Mar 21 05:40:01 EDT 2023,Thu Mar  2 04:20:01 EST 2023
Thu Mar  2 04:20:01 EST 2023,Tue Mar 21 05:41:01 EDT 2023,Fri Mar  3 03:11:01 EST 2023
Fri Mar  3 03:11:01 EST 2023,,
Fri Mar  3 03:12:02 EST 2023,,

cronスケジュールに複数のbashスクリプトがあり、次のように別々のテキストファイルを作成するのではなく、スクリプトがいつ実行されるのかを知りたいです。

date >> bash_script2.txt

すべてのスクリプトを1列に1つのスクリプトとしてスプレッドシートに入れたいです。調査中に「date」などのコマンドをcsvファイルに出力する方法が見つかりませんでした。特定のテキストや変数をcsvファイルに出力する方法はいくつかありますが、コマンドが見つからないことがわかりました。

bashのヘッダーを無視して、「Date」の出力をcsvファイルの特定の列に印刷したいと思います。

日付変数出力を使用する:

TheDate=`date +"%F %T %Z"`

printf "\n$TheDate,," >> date.csv #would go into first column
printf "\n,$TheDate," >> date.csv #would go into second column
printf "\n,,$TheDate" >> date.csv #would go into third column

上記はうまくいきますが、printfは列で最初に空の行を使用する方法を知らないようです。

+---------+---------+---------+---------+
| script1 | script2 | script3 | script4 |
+---------+---------+---------+---------+
| date    |         |         |         |
+---------+---------+---------+---------+
| date    |         |         |         |
+---------+---------+---------+---------+
|         | date    |         |         |
+---------+---------+---------+---------+
|         |         | date    |         |
+---------+---------+---------+---------+
|         |         | date    |         |
+---------+---------+---------+---------+

ベストアンサー1

私はあなたが望むものと似たようなことをするやや不都合なスクリプトを持っています:

awk -i inplace  -v myvar="$(date)" 'BEGIN {FS=OFS="," ; flag = 0}; \
{if (!flag && $2=="") {flag=1; print $1, myvar , $3} else print $0}' date.csv

スクリプトは2番目の列にのみ出力し、2番目の列が存在し、空の行が見つかった場合にのみ出力します。

awkを知っている場合は、最初または3番目の列に簡単に出力されるように変更できます。そもそもあなたが欲しいのはこれでしたか? - - - 編集する - - -

さて、もう少しスタイリッシュなスクリプトを手に入れました。文書col.awk:

BEGIN{
    FS=OFS=",";
    flag=0;
    total=3;

    "date +\"%F %T %Z\"" | getline date;
} 
{
    if(!flag && $which==""){
        flag=1;
        sub(/.*/,date,$which) ; 
    }
    print 
}
ENDFILE{
    if(!flag ){
        count=which-1
        while(count >0){
            printf ",";
            count--;
        }
        printf  date
        count=total-which
        while(count >0){
            printf ",";
            count--;
        }
            printf "\n";
    }
} 

次のように実行します。

awk -i inplace -v which=2 -f col.awk date.csv

edit2:内部編集が可能になるようにENDFILEの一部を修正しました。

おすすめ記事