2013-06-08 2 views
4

Один из столбцов в моем файле закодирован в url, я должен декодировать этот столбец и выполнить некоторые операции, основанные на значениях внутри столбца. Есть ли способ декодировать этот столбец в awk?URL-декодирование внутри AWK

+1

этот вопрос не является дубликатом одного упомянутого, название которого является неправильным. –

+0

Это не дубликат. Ответ на этот вопрос решил для меня проблему, а другая - нет. –

ответ

4

Вы должны адаптировать его в зависимости от формата файла, но основной принцип здесь (протестировано с GNU Awk 3.1.7):

sh$ echo 'Hello%2C%20world%20%21' | awk ' 
    { 
     for (i = 0x20; i < 0x40; ++i) { 
      repl = sprintf("%c", i); 
      if ((repl == "&") || (repl == "\\")) 
       repl = "\\" repl; 
      gsub(sprintf("%%%02X", i), repl); 
      gsub(sprintf("%%%02x", i), repl); 
     } 
     print 
    } 
' 
Hello, world ! 

Если у вас есть gawk, вы можете обернуть, что в функция (кредит brendanh in a comment below):

function urlDecode(url) { 
    for (i = 0x20; i < 0x40; ++i) { 
     repl = sprintf("%c", i); 
     if ((repl == "&") || (repl == "\\")) { 
      repl = "\\" repl; 
     } 
     url = gensub(sprintf("%%%02X", i), repl, "g", url); 
     url = gensub(sprintf("%%%02x", i), repl, "g", url); 
    } 
    return url; 
} 
+0

Моя строка такова: 'http% 3a% 2f% 2fwww.gazelle.com% 2fiphone% 2fiphone-3g' описанная выше операция не может декодировать эту строку .. :( – MikA

+0

Очевидно, что я использовал формат '% 02X ', которые соответствуют URL-адресу, закодированному с помощью знака процента в _uppercase_, например 'http% 3A% 2F ...' Я изменил код примера, чтобы преобразовать кодировку в нижнем регистре. Теперь он должен работать с обоими ... по крайней мере вверх до '% 40' (верхний предел цикла for). Возможно, вам придется отрегулировать это ... –

+0

Моя строка выглядит так: 1370474740 & http% 3a% 2f% 2fwww.xxxx.com% 2fiphone% 2fiphone-3g & et% 3da% 26ago% 3d212% 26ao% 3d219% 26px% 3d73% 26av1% 3d2% 26av2% 3dOrganicSearch & 13456 Когда я использую awk следующим образом: awk 'BEGIN {FS = "&"} {for (i = 0x20; i < 0x40; ++ i) gsub (sprintf ("%% % 02x ", i), sprintf ("% c ", i)); print $ 1, $ 2, $ 3} ' '% 26 ', который' & 'не преобразуется, почему? – MikA

Смежные вопросы