シェルスクリプトを使用してファイルの日付形式を変換したいと思います。
入力する:
S.no|Name|Joining_Date|Address
1|asdasd|09/18/2018|asdas
2|asd|09/18/2018|asdasd
3|asdas|09/18/2018|aadadw
出力:
S.no|Name|Joining_Date|Address
1|asdasd|18/09/2018|asdas
2|asd|18/09/2018|asdasd
3|asdas|18/09/2018|aadadw
以下は試したスクリプトです。
入力ファイル
cat datesep.txt
::
asdasd|asdasd|asdasd|30/08/2018|sadasd
asdasd|asdasd|asdasd|12/09/2018|sadasd
asdasd|asdasd|asdasd|23/06/2018|sadasd
asdasd|asdasd|asdasd|26/10/2018|sadasd
asdasd|asdasd|asdasd|23/09/2018|sadasd
asdasd|asdasd|asdasd|12/07/2018|sadasd
cattest.sh
#!/bin/bash
date +'%d-%m-%y'
DATE=`date +%d`
MONTH=`date +%m`
YEAR=`date +%y`
echo "${MONTH}/${DATE}/${YEAR}"
cattest1.sh
#!/bin/bash
SOURCEDATE=`awk -F '|' '{print $4}' /home/work/datesep.txt`
TEMP=$SOURCEDATE
echo $TEMP
DATE=`cut -c 1-2 ${TEMP}`
MONTH=`cut -c 4-5 ${TEMP}`
YEAR=`cut -c 7-10 ${TEMP}`
echo "${MONTH}/${DATE}/${YEAR}"
cattest2.sh
#!/bin/bash
awk -F '|' '{print $4}' /home/work/datesep.txt > /home/work/temp.txt
TEMP=$SOURCEDATE
echo $TEMP
DATE=`cut -c 1-2 /home/work/temp.txt`
MONTH=`cut -c 4-5 /home/work/temp.txt`
YEAR=`cut -c 7-10 /home/work/temp.txt`
echo "${MONTH}/${DATE}/${YEAR}"
cattest3.sh
#!/bin/bash
awk -F '|' '{print $4}' /home/work/datesep.txt > /home/work/temp.txt
TEMP=/home/work/temp.txt
COUNT=`cat ${TEMP} | wc -l`
echo $COUNT
echo $TEMP
LINE_NUM=1
while read LINE
do
DATE=`awk -F '/' '{print $1}' LINE`
MONTH=`awk -F '/' '{print $2}' LINE`
YEAR=`awk -F '/' '{print $3}' LINE`
echo "${MONTH}/${DATE}/${YEAR}"
((LINE_NUM++))
done < $TEMP
猫テスト4.sh
#!/bin/bash
awk -F '|' '{print $4}' /home/work/datesep.txt > /home/work/temp.txt
TEMP=`/home/work/temp.txt`
for LOOP in `/home/work/temp.txt `
do
DATE=`awk -F '/' '{print $1}' $LOOP`
MONTH=`awk -F '/' '{print $2}' $LOOP`
YEAR=`awk -F '/' '{print $3}' $LOOP`
echo "${MONTH}/${DATE}/${YEAR}"
done
答え1
|
質問で提供された入力と予想出力の最初のセットで作業し、3番目に区切られたフィールドの日付の月と日のみを交換するとします。
$ awk -F '|' -v OFS='|' 'NR > 1 { split($3, a, "/"); $3 = sprintf("%s/%s/%s", a[2],a[1],a[3]) } 1' <file
S.no|Name|Joining_Date|Address
1|asdasd|18/09/2018|asdas
2|asd|18/09/2018|asdasd
3|asdas|18/09/2018|aadadw
このコマンドは、各入力行をawk
- で区切られたフィールドを持つレコードとして扱います。|
各行(最初の行を除く)から3番目のフィールドを取得し、/
arrayに分割しますa
。次に、配列を使用してフィールドをa
目的の形式に再組み立てし、順序を使用しますsprintf()
(同様に機能しますprintf()
が、出力する代わりに生成された文字列を返します)。1
最後のアイルランドは各行が出力されるようにします(これは簡単に書く方法です{ print }
)。