Сценарий AWK. Что делает этот сценарий?

Мне нужно дублировать обработку этого сценария AWK, но я не могу понять, что он делает. Кто-нибудь может посоветовать, какова основная функция этого скрипта?

Он берет входной файл и создает выходной файл, но у меня нет доступа ни к одному из файлов, чтобы увидеть, что он делает. Это как-то связано с разделителем каналов, который разделяет столбцы во входном файле.

{ 
   if (NR == 1) {
     line = $0
     len = length(line)
       newlen = len
     while ( substr(line,newlen-1,1) == "|" )
       {
         newlen = newlen - 1
       }
     line = substr(line,1,newlen-1)
   }
     else {
     print line
     line = $0
     }
 }
 END{
      len = length(line)
      newlen = len
    while ( substr(line,newlen-1,1) == "|" ) {
      newlen = newlen - 1
    }
    line = substr(line,1,newlen-1)
      print line
}

person Rich Bianco    schedule 06.06.2011    source источник


Ответы (3)


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

person glenn jackman    schedule 06.06.2011
comment
Хорошо, это имеет смысл, я полагаю, что процесс BCP создает посторонние символы канала. Большое спасибо. - person Rich Bianco; 06.06.2011

Вау, тому, кто это написал, должно быть, заплатили по линии.

Блок кода, который встречается дважды, от len = length(line) до line = substr(line,1,newlen-1), выполняет преобразование строки, которое можно было бы просто (и более четко) выразить как замену регулярного выражения. Он вычисляет количество | символов в конце line и удаляет их. Когда строка заканчивается символом, отличным от |, один символ удаляется (это может быть случайно). Это может быть просто выполнено как gsub(/(\|+|.)$/, "", line) или gsub(/\|+)$/, "", line), если поведение без конечного | не имеет значения.

Что касается общей структуры, то в коде есть три части: что делается для первой строки (if (NR == 1) {…}), что делается для остальных строк (else {…}) и что делается после последней строки (END {…}). В первой строке переменная line устанавливается в $0 преобразовано. В последующих строках сохраненное line печатается, затем line устанавливается в текущую строку. Наконец, последняя строка печатается, преобразуется. действуйте по-разному с последней строкой: когда вы читаете строку, вы не можете знать, последняя ли она, поэтому вы сохраняете ее, печатаете предыдущую строку и идете дальше; в блоке END вы делаете то же самое для последней строки .

Вот как бы я написал. Поток данных также нетривиален (но и вряд ли надуман), но, по крайней мере, он не утонул в беспорядочном преобразовании текста.

function cleanup (line) { gsub(/(\|+|.)$/, "", line); return line }
NR != 1 { print prev }
{ prev = (NR == 1 ? cleanup($0) : $0) }
END { print cleanup(prev) }
person Gilles 'SO- stop being evil'    schedule 06.06.2011

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

person stefgosselin    schedule 06.06.2011
comment
Я тоже об этом подумал... как вы думаете, это полное удаление персонажа или оставление пустого места? Он брал файл базы данных с разделителями (bcp из sybase), поэтому я думаю, что они удаляли разделители. Возможно удаление записи заголовка?? - person Rich Bianco; 06.06.2011