Nano Hash - криптовалюты, майнинг, программирование

Изменить формат даты в первом столбце с помощью awk/sed

У меня есть сценарий оболочки, который автоматически запускается каждое утро и добавляет результаты этого дня в текстовый файл. Файл должен иметь сегодняшнюю дату в первом столбце, за которым следуют результаты, разделенные запятыми. Я использую команду date +%x, чтобы получить день в нужном формате (дд/мм/гг). Однако на одном компьютере дата +%x возвращает мм/дд/гггг (есть идеи, почему это так?). Затем я сортирую данные в файле по дате.

Вот фрагмент такого текстового файла

29/11/12,9654.80,194.32,2.01,7.19,-7.89,7.65,7.57,3.98,9625.27,160.10,1.66,4.90,-4.79,6.83,4.84,3.54                
03/12/12,5184.22,104.63,2.02,6.88,-6.49,7.87,6.67,4.10,5169.52,93.81,1.81,5.29,-5.45,7.87,5.37,4.10                
04/12/12,5183.65,103.18,1.99,6.49,-6.80,8.40,6.66,4.38,5166.04,95.44,1.85,6.04,-6.49,8.40,6.28,4.38                
11/07/2012,5183.65,102.15,1.97,6.78,-6.36,8.92,6.56,4.67,5169.48,96.67,1.87,5.56,-6.10,8.92,5.85,4.67                
07/11/2012,5179.39,115.57,2.23,7.64,-6.61,8.83,7.09,4.62,5150.17,103.52,2.01,7.01,-6.08,8.16,6.51,4.26                
11/26/2012,5182.66,103.30,1.99,7.07,-5.76,7.38,6.37,3.83,5162.81,95.47,1.85,6.34,-5.40,6.65,5.84,3.44                
11/30/2012,5180.82,95.19,1.84,6.51,-5.40,7.91,5.92,4.12,5163.98,91.82,1.78,5.58,-5.07,7.05,5.31,3.65     

Можно ли изменить формат даты для последних четырех строк на правильный формат даты с помощью awk или sed? Я хочу только изменить формат даты для тех, кто в форме мм/дд/гггг на дд/мм/гг.

04.12.2012

Ответы:


1

Похоже, вы используете два разных варианта (версии) date. Чтобы проверить, какие версии у вас есть, я думаю, что GNU date принимает флаг --version, тогда как другие версии, такие как BSD/OSX, не будут принимать этот флаг.

Поскольку вы можете использовать совершенно разные системы, вероятно, безопаснее полностью избегать date и использовать perl для печати текущей даты:

perl -MPOSIX -e 'print POSIX::strftime("%d/%m/%y", localtime) . "\n"'

Если вы уверены, что у вас есть GNU awk на обеих машинах, вы можете использовать это так:

awk 'BEGIN { print strftime("%d/%m/%y") }'

Чтобы исправить файл, который у вас есть, вот мой пример использования GNU awk:

awk '{ print gensub(/^(..\/)(..\/)..(..,)/, "\\2\\1\\3", "g"); next }1' file

Или используя sed:

sed 's/^\(..\/\)\(..\/\)..\(..,\)/\2\1\3/' file

Полученные результаты:

29/11/12,9654.80,194.32,2.01,7.19,-7.89,7.65,7.57,3.98,9625.27,160.10,1.66,4.90,-4.79,6.83,4.84,3.54                
03/12/12,5184.22,104.63,2.02,6.88,-6.49,7.87,6.67,4.10,5169.52,93.81,1.81,5.29,-5.45,7.87,5.37,4.10                
04/12/12,5183.65,103.18,1.99,6.49,-6.80,8.40,6.66,4.38,5166.04,95.44,1.85,6.04,-6.49,8.40,6.28,4.38                
07/11/12,5183.65,102.15,1.97,6.78,-6.36,8.92,6.56,4.67,5169.48,96.67,1.87,5.56,-6.10,8.92,5.85,4.67                
11/07/12,5179.39,115.57,2.23,7.64,-6.61,8.83,7.09,4.62,5150.17,103.52,2.01,7.01,-6.08,8.16,6.51,4.26                
26/11/12,5182.66,103.30,1.99,7.07,-5.76,7.38,6.37,3.83,5162.81,95.47,1.85,6.34,-5.40,6.65,5.84,3.44                
30/11/12,5180.82,95.19,1.84,6.51,-5.40,7.91,5.92,4.12,5163.98,91.82,1.78,5.58,-5.07,7.05,5.31,3.65
04.12.2012

2

Это должно работать: sed -re 's/^([0-9][0-9])\/([0-9][0-9])\/[0-9][0-9]([0-9][0-9])(.*)$/\2\/\1\/\3\4/'

Его можно сделать меньше, но я сделал так, чтобы было более очевидно, что он делает (4 группы, просто переключение месяца/дня и удаление первых двух символов года).

Совет: Если вы не хотите cat файл, вы можете внести изменения in place с помощью sed -i. Но будьте осторожны, если вы поместите ошибочное выражение, вы можете повредить исходный файл.

ПРИМЕЧАНИЕ. Предполагается, что ЕСЛИ год указан четырьмя цифрами, месяц/день перевернуты.

04.12.2012
  • Как мне запустить это в моем файле и либо заменить этот файл, либо перейти к новому файлу 04.12.2012
  • @moadeep: Вы можете cat file | sed ... > outfile или должны уметь делать sed -ire ... FILE для редактирования на месте. 04.12.2012
  • Небольшое примечание: последний (.*) в регулярном выражении и последний \4 не нужны, но и не повредят. 04.12.2012

  • 3

    Эта команда ниже сделает это.

    Примечание. Независимо от того, сколько строк содержится в файле, будут изменены только последние 4 строки.

    tail -r your_file| awk -F, 'NR<5{split($1,a,"/");$1=a[2]"/"a[1]"/"a[3];print}1'|tail -r
    

    Что ж, я мог бы придумать какой-то способ, не используя каналы и используя один оператор awk, и для этого решения действительно нужна команда tail:

    awk -F, 'BEGIN{cmd="wc -l your_file";while (cmd|getline tmp);split(tmp,x)}x[1]-NR<=4{split($1,a,"/");$1=a[2]"/"a[1]"/"a[3];print}1' your_file
    
    04.12.2012
  • Это выглядит как излишне сложное решение. Я имею в виду два разветвления хвоста, и вам все еще нужно указать количество строк для чтения? Во-вторых, опция -r недоступна в моем tail coreutils v8.20 04.12.2012
  • Я не мог использовать опцию -r. Также я хочу только изменить формат даты в форме мм/дд/гггг на дд/мм/гг. Эта команда не изменяет гггг на гг и переключает дд и мм для всех дат. 04.12.2012

  • 4

    Другое решение:

    awk -F/ 'NR<4;NR>3{a=$1;$1=$2;$2=a; print $1"/"$2"/" substr($3,3,2) substr($3,5)}' file
    
    05.12.2012

    5

    Используя авк:

    $ awk -F/ 'NR>3{x=$1;$1=$2;$2=x}1' OFS="/" file
    

    Используя / в качестве разделителя, все, что вам нужно сделать, это поменять местами 1-е и 2-е поля, что делается здесь с использованием временной переменной.

    04.12.2012
  • это не удастся, если количество строк во входном файле превышает 8 строк. 04.12.2012
  • Это хочет поменять формат для каждой даты. Я хочу только поменять местами в формате мм/дд/гггг на дд/мм/гг. 04.12.2012
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..