Строковая переменная перезаписывается вместо конкатенации в цикле for

Контекст

Я пытаюсь написать небольшую awk-программу для анализа моей истории рук на PokerStars. Истории рук хранятся в текстовых файлах и имеют следующий формат:

PokerStars Hand #225343166937:  Hold'em No Limit ($0.01/$0.02 USD) - 2021/03/30 16:14:07 ET
Table 'Pippa V' 6-max Seat #2 is the button
Seat 2: user1 ($2.12 in chips) 
Seat 3: user2 ($2.28 in chips) 
Seat 4: me ($2 in chips) 
Seat 5: user3 ($1.95 in chips) 
Seat 6: user4 ($2.06 in chips) 
user2: posts small blind $0.01
me: posts big blind $0.02
*** HOLE CARDS ***
Dealt to me [7d 9c]
user3: folds 
user4: folds 
user1: raises $0.04 to $0.06
user2: folds 
me: folds 
Uncalled bet ($0.04) returned to user1
user1 collected $0.05 from pot
user1: doesn't show hand 
*** SUMMARY ***
Total pot $0.05 | Rake $0 
Seat 2: user1 (button) collected ($0.05)
Seat 3: user2 (small blind) folded before Flop
Seat 4: me (big blind) folded before Flop
Seat 5: user3 folded before Flop (didn't bet)
Seat 6: user4 folded before Flop (didn't bet)



PokerStars Hand #225343172788:  Hold'em No Limit ($0.01/$0.02 USD) - 2021/03/30 16:14:17 ET
Table 'Pippa V' 6-max Seat #3 is the button
Seat 2: user1 ($2.15 in chips) 
...

(Имена пользователей изменены, чтобы уважать конфиденциальность игроков)

Каждая запись (= рука) разделена тремя переносами строки. Я дошел до того, что разделил руки на записи, а затем перебрал каждую строку, чтобы сохранить соответствующие данные в переменных и распечатать их. Моя маленькая программа на awk выглядит так:

BEGIN{
  RS = "\n\r\n\r\n\r\n";
  FS = "\n";
  OFS = ",";
  print "Hand ID,Game Type,Time,Holecards";
}
{
  for (i = 1; i <= NF; i++)
  {
    if ($i ~ /^PokerStars Hand/)
    {
      split($i, aHand, " ");
      handID = aHand[3];
      gameType = aHand[5]" "aHand[6]" "aHand[7]" "aHand[8];
      dateTime = aHand[10]" "aHand[11]" "aHand[12];
    }
    if ($i ~ /^Dealt to /)
    {
      split($i, aHoleCards, " ");
      holeCards = aHoleCards[4]" "aHoleCards[5];
    }
  }
  print(handID, gameType, dateTime, holeCards);
  #printf("%s, %s, %s, %s\n", handID, gameType, dateTime, holeCards); # Same problem here
}

Проблема

Результат, который я ожидаю получить (из первых рук):

Hand ID,Game Type,Time,Holecards
#225343172788:,No Limit ($0.01/$0.02 USD),2021/03/30 16:14:17 ET,[7d 9c]

Однако результат другой. Для первой записи переменные handID, gameType и dateTime кажутся пустыми, тогда как holeCards печатаются. Остальные переменные затем появляются во второй строке, но каким-то образом «перезаписываются» переменной holeCards второй записи:

Hand ID,Game Type,Time,Holecards                                                                      
,,,[7d 9c]                                                                                                
,[Kd As]72788:,No Limit ($0.01/$0.02 USD),2021/03/30 16:14:17 ET

Надеюсь, мое описание не слишком запутано. Я очень запутался в результате. Я пробовал использовать printf вместо print, но результат тот же. Подозреваю, что я здесь что-то несложное.

Добро пожаловать в SO и особая благодарность за добавление кода, примеров и размещение подробных вопросов уровня. Переходя к вашему вопросу, когда я запускаю ваш код, я получаю точный ожидаемый результат, который вы опубликовали. Я вижу, вы поместили \r в свой RS, который является управляющим символом M, не могли бы вы подтвердить, нужны ли они вам в вашем файле?

RavinderSingh13 06.04.2021 14:22

Спасибо за быстрый комментарий. Сначала я пробовал "\ n \ n \ n" в качестве RS, но каким-то образом awk не нашел никаких вхождений (я проверил NR в конце программы, и он всегда был 1). После изменения на то, что есть сейчас, awk распознает разные руки как записи. Меня это сбивало с толку (также потому, что я нахожу 129 случаев появления "\ n \ n \ n" при использовании vim), но я придерживался этого, поскольку казалось, что это единственный способ заставить awk распознавать три разрыва строки. Как вы думаете, проблема связана с RS?

DavidHk 06.04.2021 14:35

Какую ОС и текстовый редактор вы используете? Новая строка (также известная как конец строки или EOL) - это \n под Unix и '\ r \ n' под Windows по умолчанию. В текстовом файле может использоваться Windows EOL.

Ludovic Kuty 06.04.2021 17:27

Я использую Arch Linux, но входные файлы были созданы в Windows (что затем объясняет странность \r\n). Кодировка - UTF-8.

DavidHk 06.04.2021 17:53

Я не понимаю, почему у вас есть только \r\n и еще только \n. Всегда ли должен быть \r\n? Если только записи не разделены в стиле Windows и полях в стиле Unix.

Ludovic Kuty 06.04.2021 19:20

@DavidHk - Сложность проблемы можно уменьшить, предварительно преобразовав файл из Windows в окончание строки Unix.

Armali 06.04.2021 23:16
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
6
35
0

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