この休日リストを日付形式に変換するには、スクリプトが必要です。私の入力ファイル
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}