2016-05-19 3 views
0

Я скопированная 3 столбцов данных в файл через запятую (,) и делать некоторые строки манипуляцию, но не знают, почему пустой «» добавляются для каждого линейчатогоРазбор данных с использованием AWK

Моего Входного файл-

"['3.FIT-DYN', '3.MYFIT-LTR-DYN']",FIT-L-PHY-PRM-GI,2014-07-11 14:07:28+0000 
['1.839324'],4.FIDCWRRTL,2015-04-16 12:04:21+0000 
       ,4.AIQM,2015-04-16 12:04:21+0000 

Если вы видите, что только 3-я строка имеет пустые данные на первом месте.

мои awk-

 BEGIN { FS=",?\"?[][]\"?,?"; OFS="," } 
    { 
     if (split($2,a,/\047/)) { 
      for (j=2; j in a; j+=2) { 
      $2 = a[j] 
      prt() 
     } 
    } 
    else { 
    prt() 
     } 
    } 


    function prt( out) { 
     out = "\047" $0 "\047" 
     gsub(OFS,"\047,\047",out) 
     print out 
    } 

о/р-

'','3.FIT-DYN','FIT-L-PHY-PRM-GI','2014-07-11 14:07:28+0000' 
    '','3.MYFIT-LTR-DYN','FIT-L-PHY-PRM-GI','2014-07-11 14:07:28+0000' 
    '','1.839324','4.FIDCWRRTL','2015-04-16 12:04:21+0000' 
    '','4.AIQM','2015-04-16 12:04:21+0000' 

ожидаемые о/р-

'3.FIT-DYN','FIT-L-PHY-PRM-GI','2014-07-11 14:07:28+0000' 
    '3.MYFIT-LTR-DYN','FIT-L-PHY-PRM-GI','2014-07-11 14:07:28+0000' 
    '1.839324','4.FIDCWRRTL','2015-04-16 12:04:21+0000' 
    '','4.AIQM','2015-04-16 12:04:21+0000' 

ответ

1

Вы используете квадратные скобки в качестве разделителей полей. В ваших данных первый символ представляет собой квадратную скобку, то есть разделитель полей. Это означает, что ваше первое поле - это все , которое предшествует первый разделитель полей, в данном случае пустая строка.

я предлагаю что-то другое:

BEGIN { FS="]\"?,"; OFS="," } 
NF == 1 { sub("^[[:blank:]]*", "''"); print; next } 
{ 
    sub(" *\"?\\[", "", $1); 
    count = split($1, fields, ", *"); 
    for (i = 1; i <= count; i++) { 
     $1 = fields[i] 
     print 
    } 
} 
+0

Первый аргумент для суб() и 3RG арг для раскола() являются регулярными выражениями, а не строки, так что вы должны быть с помощью регулярных выражений ограничителей '' /.../ вместо строковых разделителей '" ... "'. Первые определяют константы регулярного выражения, которые берутся как есть, тогда как последние определяют динамические регулярные выражения, которые нужно анализировать дважды, один раз для преобразования из строки в регулярное выражение, а затем снова при использовании в качестве регулярного выражения и, следовательно, имеют некоторые дополнительные сложности, включая требование удвоение побегов. Используйте 'sub (/ regexp /, string)' и 'split (string, array,/regexp /)' если это необходимо, например, для создания regexp через конкатенацию: 'sub (" foo "$ 1," bar ")'. –

+1

@EdMorton Справедливая точка. –

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