用于转换文件中的日期格式的 Shell 脚本

用于转换文件中的日期格式的 Shell 脚本

我想使用 shell 脚本转换文件中的日期格式。

输入:

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 

猫测试.sh

#!/bin/bash  
date +'%d-%m-%y'  
DATE=`date +%d`  
MONTH=`date +%m`  
YEAR=`date +%y`  
echo "${MONTH}/${DATE}/${YEAR}"  

猫测试1.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}"  

猫测试2.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}"  

猫测试3.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

从问题中的第一组给定输入和预期输出开始工作,并假设您只想交换第三个|分隔字段中的日期中的月份和日期。

$ 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的记录。|它获取每行(第一行除外)上的第三个这样的字段并将其拆分/到 array 中a。然后,它使用数组将字段重新组装a成所需的格式并使用顺序sprintf()(其工作原理类似printf(),但返回生成的字符串而不是输出它)。1末尾的孤岛导致每一行被输出(这是一种简短的写法{ print })。

相关内容