преобразование 4-значного года в 2-значный в сценарии оболочки

#linux #shell #awk

Вопрос:

У меня есть файл в виде:

 $cat file.txt
1981080512 14 15
2019050612 17 18
2020040912 19 95
 

Здесь 1-й столбец представляет даты как ГГГГММДДХХ

Я хотел бы записать даты как YYMMDDHH. Итак, результат желания:

 81080512 14 15
19050612 17 18
20040912 19 95
 

Мой сценарий:

 while read -r x;do
yy=$(echo $x | awk '{print substr($0,3,2)}')
mm=$(echo $x | awk '{print substr($0,5,2)}')
dd=$(echo $x | awk '{print substr($0,7,2)}')
hh=$(echo $x | awk '{print substr($0,9,2)}')

awk '{printf "s%4s%4sn",'$yy$mm$dd$hh',$2,$3}'
done < file.txt
 

Он печатает

 81080512   14  15
81080512   17  18
 

Любая помощь, пожалуйста. Спасибо.

Комментарии:

1. Ооочень вы хотите удалить первые два символа? Зачем весь синтаксический анализ? Просто cut -c3- ?

Ответ №1:

Пожалуйста, не убивайте меня за этот простой ответ, но как насчет этого:

 cut -c 3- file.txt
 

Вы просто сокращаете первые две цифры, показывая символ 3 до конца каждой строки ( -c переключатель указывает, что вам нужно вырезать символы (не байты, …)).

Комментарии:

1. О .. это было так просто, но я делал это таким сложным!!!! Большое спасибо. Возможно ли любезно помочь мне в моем понимании. Почему мой скрипт печатается неправильно?

Ответ №2:

Вы можете сделать это, используя отдельные GNU AWK substr следующим образом, пусть file.txt содержимое будет тогда

 1981080512 14 15
2019050612 17 18
2020040912 19 95
 

затем

 awk '{$1=substr($1,3);print}' file.txt
 

вывод

 81080512 14 15
19050612 17 18
20040912 19 95
 

Объяснение: я использовал substr функцию для получения 3-го и последующих символов из 1-го столбца и присвоения его обратно указанному столбцу, затем я print изменил строку.

(протестировано в gawk 4.2.1)