祝日テーブルの作成

祝日テーブルの作成

この休日リストを日付形式に変換するには、スクリプトが必要です。私の入力ファイル

MMYYYY CAL_B2K_ID   123456789012345678901234567890  
------ ------------ ------------------------------- 
012016 821          YY      Y      Y      Y      Y  
012016 DC           YY      Y      Y      Y      Y  
022016 DC                Y      Y      Y      Y     
022016 821               Y      Y      Y      Y     
032016 DC               Y      Y      Y      Y      
032016 821              Y      Y      Y      Y      
042016 821           Y      Y      Y      Y         

現在、123456789012345678901234567890は日付と同じです。最初の0が現れると10になり、次に1が11を意味する式です。 ...

 1 2 3 4 5 6 7 8 9 10 11 12 13 14............

そのため、Yがある場所ごとに日付に変換されるスクリプトを作成しました。最初の行Yが1、2、9、6、3、9の下に現れるとしましょう。

私のスクリプトは、21〜52列の各行を削除し、その列がYであることを確認します。その場合、Yが列23の下に表示されるように日付が非表示になります。次に、減算(列番号 - 20)を実行して3を取得し、concat演算子を使用して日付を作成します。

以下は私のスクリプトです。しかし、私が直面している問題は、どの列の下にもYがなければ、私のvarを空白として提供し、空白が実際の状態にも現れるということです。

var=echo $f1 | cut -c$i
if [[ "$var"='Y' ]] ;

私のスクリプトは次のとおりです。

 rm f1.txt
 set -x
 while read f1
 do
 for((i=21;i<23;i++));
 do
 var=`echo $f1 | cut -c$i`
 if [[ "$var"='Y' ]] ;
 then
 echo $var
 month=`echo $f1 | cut -c1-2`
 year=`echo $f1 |cut -c3-6`
 date=$(($i-20))
 echo $year"-"$month"-"$date >> f1.txt
 fi
done
done < holiday_india.txt`

varに何もない場合、If条件がtrueとして表示されないようにする方法を教えてください。

このスクリプトのO / Pは、Yではなく各行の21から52のすべての列を日付に変換することです。

さて、その点を明らかにしたことを願っています。

答え1

さて、以下のスクリプトをコピーして読みやすいようにインデントを修正しました。 (また、バックティックを変更し$()て固定ファイル名を削除しました。そのような方法が好きだからです。)

while read f1 ; do
    for((i=21;i<23;i++)); do
        var=$(echo $f1 | cut -c$i)
        if [[ "$var"='Y' ]] ; then
            echo $var
            month=$(echo $f1 | cut -c1-2)
            year=$(echo $f1 |cut -c3-6)
            date=$(($i-20))
            echo "$year-$month-$date"
        fi
    done
done

二つが私に現れた。

if [[ "$var"='Y' ]] ; then

これはうまくいきません。等号の周りにスペースが必要です。それを試して、[[ X=Y ]] && echo foo何が起こるかを見てください。

ここでも

var=$(echo $f1 | cut -c$i)

f1次の内容が含まれているが012016 821 YY Y Y Y Y引用されていないため、拡張された次のスペースに沿って単語が分割され、次に区切られたすべてのecho単語が印刷されます。一つ引用符012016 821 YY Y Y Y Yを追加して問題を解決できますが、長さの部分文字echo "$f1" | cut -c$i列を取得することもできます。"${f1:N:L}"エル場所から窒素。ただし、インデックスは0なので、$i変更された範囲が必要です。

次に、

echo "$year-$month-$date"

printf "%04d-%02d-%02d\n" "$year" "$month" "$date"日付が常に2桁に印刷され、可能な異常値を防ぐために変更できます$year

月と年の割り当ては行全体で同じに保たれるため、外部ループに移動すると便利です。

今私達は:

while read f1; do
    month="${f1:0:2}"
    year="${f1:2:4}"
    for (( i=20 ; i < 20 + 31 ; i++ )); do
        var="${f1:$i:1}"
        if [[ "$var" = "Y" ]] ; then
            date=$(( $i - 19 ))
            printf "%04d-%02d-%02d\n" "$year" "$month" "$date"
        fi
    done
done

実行すると、出力が正しく表示されますbash holiday.sh < holiday_india.txt

2016-01-01
2016-01-02
2016-01-09
2016-01-16
2016-01-23
2016-01-30
2016-01-01

もちろん、あなたはその月を通して2倍に増えたようです。彼らの生産量も2倍になりました。 2番目の列の内容のテストを追加するか、次のように実行して、指定されたIDを持つ行のみを確認できます。

grep DC holiday_india.txt | bash holiday.sh

(もちろんヘッダ行もスキップされます。または、行の先頭の月/年が正しいことを確認することもできます。)

これはkshでタグ付けされていますが、bashを使用しています。ksh私はサポートコピーを持っていますが、これが私が使用している唯一の新しい構文だと思います。${foo:N:L}

関連情報