我想使用 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 }
)。