Я пытаюсь написать небольшую 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
, но результат тот же. Подозреваю, что я здесь что-то несложное.
Спасибо за быстрый комментарий. Сначала я пробовал "\ n \ n \ n" в качестве RS, но каким-то образом awk не нашел никаких вхождений (я проверил NR в конце программы, и он всегда был 1). После изменения на то, что есть сейчас, awk распознает разные руки как записи. Меня это сбивало с толку (также потому, что я нахожу 129 случаев появления "\ n \ n \ n" при использовании vim), но я придерживался этого, поскольку казалось, что это единственный способ заставить awk распознавать три разрыва строки. Как вы думаете, проблема связана с RS?
Какую ОС и текстовый редактор вы используете? Новая строка (также известная как конец строки или EOL) - это \n
под Unix и '\ r \ n' под Windows по умолчанию. В текстовом файле может использоваться Windows EOL.
Я использую Arch Linux, но входные файлы были созданы в Windows (что затем объясняет странность \r\n
). Кодировка - UTF-8.
Я не понимаю, почему у вас есть только \r\n
и еще только \n
. Всегда ли должен быть \r\n
? Если только записи не разделены в стиле Windows и полях в стиле Unix.
@DavidHk - Сложность проблемы можно уменьшить, предварительно преобразовав файл из Windows в окончание строки Unix.
Добро пожаловать в SO и особая благодарность за добавление кода, примеров и размещение подробных вопросов уровня. Переходя к вашему вопросу, когда я запускаю ваш код, я получаю точный ожидаемый результат, который вы опубликовали. Я вижу, вы поместили
\r
в свой RS, который является управляющим символом M, не могли бы вы подтвердить, нужны ли они вам в вашем файле?