쉘 스크립트를 사용하여 파일의 날짜 형식을 변환하고 싶습니다.
입력하다:
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
|
질문에 제공된 입력 및 예상 출력의 첫 번째 세트에서 작업하고 세 번째로 구분된 필드에 있는 날짜의 월과 일만 교환한다고 가정합니다 .
$ 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 }
).