awk getline, пропускающий к последней строке - возможная проблема символа новой строки - PullRequest
0 голосов
/ 16 октября 2011

Я использую

while( (getline line < "filename") > 0 )

внутри моего оператора BEGIN, но этот цикл while, кажется, читает только последнюю строку файла вместо каждой строки. Я думаю, что это может быть проблема символа новой строки, но на самом деле я не знаю. Есть идеи?

Я пытаюсь прочитать данные из файла, отличного от основного входного файла.

Тот же синтаксис на самом деле работает для одного файла, но не для другого, и единственное отличие, которое я вижу, состоит в том, что тот, для которого он работает, имеет "^ M" в конце каждой строки, когда я смотрю на него в Vim, и тот, для которого он не работает, не имеет ^ M. Но это кажется странной проблемой на моем (на основе UNIX) Mac.

Хотелось бы, чтобы я понимал, что происходит с getline намного лучше, чем я.

Ответы [ 2 ]

1 голос
/ 14 августа 2012

Вы должны указать RS для чего-то более расплывчатого. Вот уродливый хак, чтобы все заработало

RS="[\x0d\x0a\x0d]"

Теперь, это может потребовать некоторого объяснения. В разных системах используются разные способы обработки смены строки. Прочитайте http://en.wikipedia.org/wiki/Carriage_return и http://en.wikipedia.org/wiki/Newline, если вы заинтересованы в этом.

Обычно awk грациозно с этим справляется, но, похоже, в вашей среде некоторые файлы порочат. 0x0d или 0x0a или 0x0d 0x0a (CR + LF) должно быть там, но не смешано.

Итак, давайте попробуем пример смешанного потока данных

$ echo -e "foo\x0d\x0abar\x0d\x0adoe\x0arar\x0azoe\x0dqwe\x0dtry" |awk 'BEGIN{while((getline r )>0){print "r=["r"]";}}'

Результат:

r=[foo]
r=[bar]
r=[doe]
r=[rar]
try]oe

Мы видим, что последние строки потеряны. Теперь с помощью некрасивого хака на RS

$ echo -e "foo\x0d\x0abar\x0d\x0adoe\x0arar\x0azoe\x0dqwe\x0dtry" |awk 'BEGIN{RS="[\x0d\x0a\x0d]";while((getline r )>0){print "r=["r"]";}}'

Результат:

r=[foo]
r=[bar]
r=[doe]
r=[rar]
r=[zoe]
r=[qwe]
r=[try]

Мы можем видеть, что каждая строка получена, независимо от мусора 0x0d 0x0a: -)

0 голосов
/ 16 октября 2011

Может быть, вы должны предварительно обработать ваш входной файл, например, dos2unix (http://sourceforge.net/projects/dos2unix/) утилита?

...