0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【CSH】よくあるsplit関数で分割した文字列を配列に取り込む方法(awk)

Posted at

cshにもsplitはあるけど、掲題のような用途ではないですね。
PowershellやVBなんかでよくsplitをこういう使い方しますよね。

cshではこんな風に実現します。

素龍諸ん

例えばよくあるのは、ファイル名から日付データを取り込みたい場合とか。
年月日を取るのに三行もコード書くのバカバカしいですよね。
だからこうします

csh
///対象のファイル名:console.2023.01.01.log
foreach f(`ls`)
    set YMD = (`echo $f | awk -F.'{print $2,$3,$4}'`)
    set DateSTR = `date -d"$YMD[1]/$YMD[2]/$YMD[3] + 1 days ago" +%Y%m%d`
    echo $DateSTR
end
///出力結果
20221231

解説

set YMD = (`echo $f | awk -F.'{print $2,$3,$4}'`)
キモいところから行きますね。
変数に入力するとき、カッコで囲うと配列として代入されます。
配列のデミリタ(区切り文字)は空白かタブか改行なので、
printするものをカンマ区切りにすると空白で区切るので、いい具合に配列化されます。
※つまり、文字列に改行があると、そこで…(こわ)

set DateSTR = `date -d"$YMD[1]/$YMD[2]/$YMD[3] + 1 days ago" +%Y%m%d`
余談だけど使い方の説明になるので一応。
配列なのでインデックスを指定せねばなりません。
cshはなぜか1スタートなので、0はないです。
んで、上記の通り$YMD[1]こんな風に[]で要素数を入力します。

もっと余談になりますが、要素数を知りたい場合は$#YMDと入力します。

そして全く関係ないdateコマンドの説明ですが、-dで出力する日付を指定できます。
んで、大体の場合取得できた日そのままを愚直に欲しい場合ってそんなないので、
前日を取るサンプルにしています。

ちなみに、1ヶ月後の昨日を欲しい場合は
date -d"1 months + 1 days ago"
っすね。これ、なんぼでも繋げるそうです。
無限じゃあないでしょうけども。

ではこんなもんで。さようなら

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?