Script de shell para converter o formato de data em um arquivo [duplicado]

2

Eu gostaria de converter o formato de data no arquivo, usando um script de shell.

Entrada:

S.no|Name|Joining_Date|Address
1|asdasd|09/18/2018|asdas
2|asd|09/18/2018|asdasd
3|asdas|09/18/2018|aadadw

Saída:

S.no|Name|Joining_Date|Address
1|asdasd|18/09/2018|asdas
2|asd|18/09/2018|asdasd
3|asdas|18/09/2018|aadadw

Abaixo estão os scripts que tentaram

Arquivo de entrada:% 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 

cat test.sh

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

cat test1.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}"  

cat test2.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}"  

cat test3.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 

cat test4.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  
    
por Anand 18.09.2018 / 12:11

1 resposta

4

Trabalhando a partir do primeiro conjunto de entrada e saída esperadas na pergunta e supondo que você deseja trocar o mês e o dia na data no terceiro campo | -delimited.

$ 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

Este comando awk trata cada linha de entrada como um registro com campos | -delimited. Ele pega o terceiro campo em cada linha (exceto a primeira linha) e o divide em / na matriz a . Em seguida, ele remonta o campo usando a matriz a no formato desejado e a ordem usando sprintf() (que funciona como printf() , mas retorna a sequência gerada em vez de gerá-la). O único 1 no final faz com que cada linha seja produzida (é uma maneira breve de escrever { print } ).

    
por 18.09.2018 / 13:10