извлечение определенных чисел из текстового файла и преобразование в год и день

Если sudo rm -rf foldername не работает, то выполните ниже процедуру

Проверьте с помощью команды

which rm 

, затем проверьте путь. в моем случае это было /bin/rm, а затем запустить команду вроде

/bin/rm -rf foldername
1
задан 20 October 2015 в 16:42

2 ответа

С помощью этого скрипта

#!/usr/bin/env bash
while read -r line; do 
    year=$(sed 's/^.\{4,4\}\([0-9]\{3,3\}\)0\.\(.*\)o/\1 \2/' <(echo "$line") | awk '{system("date -d \"01/01/"$2" +"$1" days -1 days\" +\"%Y\"")}')
    month=$(sed 's/^.\{4,4\}\([0-9]\{3,3\}\)0\.\(.*\)o/\1 \2/' <(echo "$line") | awk '{system("date -d \"01/01/"$2" +"$1" days -1 days\" +\"%m\"")}')
    day=$(sed 's/^.\{4,4\}\([0-9]\{3,3\}\)0\.\(.*\)o/\1 \2/' <(echo "$line") | awk '{system("date -d \"01/01/"$2" +"$1" days -1 days\" +\"%d\"")}')
done <foo

Пример

#!/usr/bin/env bash
while read -r line; do 
    year=$(sed 's/^.\{4,4\}\([0-9]\{3,3\}\)0\.\(.*\)o/\1 \2/' <(echo "$line") | awk '{system("date -d \"01/01/"$2" +"$1" days -1 days\" +\"%Y\"")}')
    month=$(sed 's/^.\{4,4\}\([0-9]\{3,3\}\)0\.\(.*\)o/\1 \2/' <(echo "$line") | awk '{system("date -d \"01/01/"$2" +"$1" days -1 days\" +\"%m\"")}')
    day=$(sed 's/^.\{4,4\}\([0-9]\{3,3\}\)0\.\(.*\)o/\1 \2/' <(echo "$line") | awk '{system("date -d \"01/01/"$2" +"$1" days -1 days\" +\"%d\"")}')

    echo "$year"
    echo "$month"
    echo "$day"
done <foo

дает выход

2014
03
08
2014
03
09
2014
03
10
1
ответ дан 23 May 2018 в 16:32

Основная идея

Время эпохи Unix работает в секундах. Сценарий выдает год, конвертирует первый день года в эпоху unix-эпохи, компенсирует его (86400 секунд в день) * (извлеченные дни - 1) и преобразует его обратно в читаемый для человека формат

Основная идея

#!/bin/bash
#set -x
SECONDSINYEAR=86400

while  read line && [[ -n $line ]];do
   ARRAY=( $( awk -F '.' '!/^$/{gsub(/[a-z,A-Z]/,""); print substr($1,1,3),$2 }' <<< "$line") )
   ARRAY[0]=$( expr ${ARRAY[0]} - 1  )
   DAYOFFSET=$( expr ${ARRAY[0]} \* 86400 )
   BASEDATE=$(date -d ${ARRAY[1]}0101 +%s)
   ACTUALDATE=$( expr $BASEDATE + $DAYOFFSET )

   date -d "@$ACTUALDATE" +%d" "%m" "%Y

done  < $1

Выход

xieerqi:$ cat testFile.txt                                                
joze0670.14o
joze0680.14o
joze0690.14o


xieerqi:$ ./extractDate.sh testFile.txt                                   
08 03 2014
09 03 2014
10 03 2014
1
ответ дан 23 May 2018 в 16:32
  • 1
    cat file | while ... можно упростить до while read ... do ... done < file. Также обратите внимание, что разделитель полей по умолчанию awk (как для ввода, так и для вывода) - это пробел, поэтому print substr() " " $2 можно упростить до print substr(), $2. Кроме того, printf "$line" | awk '...' можно записать как awk '...' <<< "$line". – fedorqui 20 October 2015 в 18:46
  • 2
    @fedorqui благодарю вас, добавив их в скрипт прямо сейчас – Sergiy Kolodyazhnyy 20 October 2015 в 18:53
  • 3
    И если вы используете bash, нет причин использовать $(expr ...). Просто сделайте $((${ARRAY[0]} - 1)), $((${ARRAY[0]} * 86400)) и т. Д. – muru 20 October 2015 в 18:54
  • 4
    @Serg вообще нет. $(( )) является bash для арифметического расширения . – muru 20 October 2015 в 18:57
  • 5
    См.: , как подавить интерпретацию восьмеричного номера bash? (интерпретироваться как десятичное – fedorqui 20 October 2015 в 19:05

Другие вопросы по тегам:

Похожие вопросы: