ファイルの日付形式を変換するシェルスクリプト

ファイルの日付形式を変換するシェルスクリプト

シェルスクリプトを使用してファイルの日付形式を変換したいと思います。

入力する:

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 })。

おすすめ記事