Отметка времени awk, установленная в начальном блоке

Я устанавливаю метку времени в начальном блоке:

BEGIN  { 
  timestamp = strftime("%Y%m%d%H%M%S");
}

Я больше не обновляю временную метку в остальной части скрипта. Я ожидаю, что временная метка не изменится, но это так.

Позже в сценарии я печатаю $0 в файл:

FNR>1{
  #do some stuff
  print $0 > "/mnt/data/logs/TEST_"timestamp".csv"
  ...

метка времени меняется, и он продолжает печатать в новый файл. . . TEST_1.csv, TEST_2.csv . . .

Он работает, как и ожидалось, с небольшим файлом, но когда я использую полный файл данных, он печатает несколько файлов.


person mackmama    schedule 05.01.2016    source источник
comment
Что-то должно изменить timestamp. Можете ли вы показать остальную часть кода? Что это awk?   -  person Etan Reisner    schedule 05.01.2016
comment
Я не могу воспроизвести это, используя файл из 5 миллионов строк.   -  person John Hascall    schedule 05.01.2016
comment
Блок BEGIN вызывается только один раз, независимо от количества строк или файлов. Возможно, вы вызываете скрипт более одного раза?   -  person karakfa    schedule 05.01.2016
comment
Найдите отметку времени слова в своем файле, так как она изменяется в каком-то разделе кода, который вы нам не показали. Если вы не можете обнаружить проблему, создайте наименьший из возможных сценариев, демонстрирующий такое поведение, и опубликуйте этот полный сценарий, чтобы мы могли его увидеть.   -  person Ed Morton    schedule 05.01.2016
comment
Да. Я сделал это @EdMorton. Я устанавливаю временную метку только в начальном блоке.   -  person mackmama    schedule 05.01.2016
comment
awk -f validator.awk formatter.csv rawData/sample2.csv @karakfa — я называю это так, когда форматер содержит шаблоны, которые я использую для разбора/проверки строк в sample2.csv.   -  person mackmama    schedule 05.01.2016
comment
@EtanReisner - GNU Awk 4.0.1 Я попробую добавить код.   -  person mackmama    schedule 05.01.2016
comment
Для быстрой проверки удалите блок BEGIN и посмотрите, что произойдет.   -  person karakfa    schedule 05.01.2016
comment
Я переместил блок timestamp = strftime("%Y%m%d%H%M%S"); в блок FNR==1 с теми же результатами. Я не могу удалить весь начальный блок, так как устанавливаю там разделители.   -  person mackmama    schedule 05.01.2016
comment
Я переместил настройку метки времени в блок FNR==1 с аналогичными результатами. FNR==1 { $1=$1 timestamp = strftime("%Y%m%d%H%M%S"); #print header print $0 > "/mnt/data/work/sl_output.csv" print $0 > "/mnt/data/logs/sl_fail_output_"timestamp".csv" next } Я использую метку времени здесь и здесь: FNR>1 { print $0 > "/mnt/data/logs/sl_no_license_match_"timestamp".csv" }`   -  person mackmama    schedule 05.01.2016
comment
Не пытайтесь публиковать форматированный текст, код или что-то еще в комментариях, так как это нечитаемо - отредактируйте свой вопрос. Однако я вижу, что в вашем комментарии вы, кажется, устанавливаете метку времени в блоке FNR == 1, а НЕ в блоке BEGIN, как вы показываете в своем вопросе. Это, очевидно, БУДЕТ иметь огромное значение. Прекратите перетасовывать код в надежде, что произойдет волшебство - просто сделайте то, что я просил, и отредактируйте свой вопрос, чтобы показать самый маленький полный сценарий, который вы можете создать, который создает проблему. Скорее всего, выполняя это упражнение, вы поймете это сами.   -  person Ed Morton    schedule 05.01.2016


Ответы (1)


Ладно, ребята, я разобрался с проблемой. Я вызываю вспомогательный awk-скрипт, который, по моему мнению, не имеет значения. Извините, что не включил это изначально. Поэтому, когда я вызываю функцию регистратора для этого скрипта, она обновляет переменную метки времени. Я исправил проблему, просто изменив временную метку на временную метку1 в своем сценарии.

Спасибо всем, кто откликнулся и смирился с моей неопытностью!

person mackmama    schedule 05.01.2016