Скрипт AWK - Что делает этот скрипт? - PullRequest
1 голос
/ 06 июня 2011

Мне нужно продублировать обработку этого скрипта 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
}

Ответы [ 3 ]

3 голосов
/ 06 июня 2011

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

3 голосов
/ 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 устанавливается на текущую строку. Наконец, последняя строка печатается, преобразуется Этот шаблон print-previous-then-save-current является распространенным приемом, который действует по-разному в последней строке: когда вы читаете строку, вы не можете знать, последняя ли она, поэтому сохраняете ее, печатаете предыдущую строку. и двигаться дальше; в блоке END вы делаете то же самое для последней строки.

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

function cleanup (line) { gsub(/(\|+|.)$/, "", line); return line }
NR != 1 { print prev }
{ prev = (NR == 1 ? cleanup($0) : $0) }
END { print cleanup(prev) }
1 голос
/ 06 июня 2011

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

...