2014-08-07 2 views
2

Хотелось бы прочитать первый столбец, а затем «Заполнить вниз» значение «Пустое столбец» с использованием значения «Предыдущее значение« Пустое значение столбца ».awk, чтобы заполнить пустое значение столбца с использованием значения «Предыдущее неиспользуемое значение столбца»:

input.txt

20      0 ABC   1 N DEFABC  0  CHARGE  
          1 ABC   1 N GHIABC  0  CHARGE  
          2 ABC   1 N JKLABC  0  CHARGE  
          3 ABC   1 N MNOABC  0  CHARGE  
          4 ABC   1 N PQRABC  0  CHARGE  
210&&-2     0 ABC   1 N DEFABC  0  CHARGE  
          1 ABC   1 N GHIABC  0  CHARGE  
          2 ABC   1 N JKLABC  0  CHARGE  
          3 ABC   1 N MNOABC  0  CHARGE  
          4 ABC   1 N PQRABC  0  CHARGE  
2130&&-4&-6&&-9   0 ABC   1 N DEFABC  0  CHARGE  
          1 ABC   1 N GHIABC  0  CHARGE  
          2 ABC   1 N JKLABC  0  CHARGE  
          3 ABC   1 N MNOABC  0  CHARGE  
          4 ABC   1 N PQRABC  0  CHARGE 

Пытались ниже сценария командной строки и работает нормально, если файл отдел ют «» де-ограничитель и он не работает для FS = „“ и FS = "\ t "для вышеуказанного ввода образца.

$ awk -f FillEmpty.awk Input.txt 

$ cat FillEmpty.awk 

BEGIN { FS = "" } 

$1 != "" { print } 

$1 == "" { 
     # fill in blanks 
     for (i = 1; i <= NR; i++) 
       if ($i == "") 
         $i = Saved[i] 

     print 
} 

{ 
     # save all fields 
     for (i = 1; i <= NR; i++) 
       Saved[i] = $i 
} 

Желаемая Выход:

20      0 ABC   1 N DEFABC  0  CHARGE  
20      1 ABC   1 N GHIABC  0  CHARGE  
20      2 ABC   1 N JKLABC  0  CHARGE  
20      3 ABC   1 N MNOABC  0  CHARGE  
20      4 ABC   1 N PQRABC  0  CHARGE  
210&&-2     0 ABC   1 N DEFABC  0  CHARGE  
210&&-2     1 ABC   1 N GHIABC  0  CHARGE  
210&&-2     2 ABC   1 N JKLABC  0  CHARGE  
210&&-2     3 ABC   1 N MNOABC  0  CHARGE  
210&&-2     4 ABC   1 N PQRABC  0  CHARGE  
2130&&-4&-6&&-9   0 ABC   1 N DEFABC  0  CHARGE  
2130&&-4&-6&&-9   1 ABC   1 N GHIABC  0  CHARGE  
2130&&-4&-6&&-9   2 ABC   1 N JKLABC  0  CHARGE  
2130&&-4&-6&&-9   3 ABC   1 N MNOABC  0  CHARGE  
2130&&-4&-6&&-9   4 ABC   1 N PQRABC  0  CHARGE 

Любые предложения ...!

ответ

1

Это работает для фиксированной ширины:

awk 'substr($0,0,24) ~ $1 { f=$1 }{ $0=f substr($0, length(f)+1) } 1' file 

Если есть что-то в первом столбце, сохраните значение f. В любом случае, замените значение в строке. 1 в конце гарантирует, что линия будет напечатана.

Тестирование это:

$ awk 'substr($0,0,24) ~ $1 { f=$1 }{ $0=f substr($0, length(f)+1) } 1' file 
20      0 ABC   1 N DEFABC  0  CHARGE  
20      1 ABC   1 N GHIABC  0  CHARGE  
20      2 ABC   1 N JKLABC  0  CHARGE  
20      3 ABC   1 N MNOABC  0  CHARGE  
20      4 ABC   1 N PQRABC  0  CHARGE  
210&&-2     0 ABC   1 N DEFABC  0  CHARGE  
210&&-2     1 ABC   1 N GHIABC  0  CHARGE  
210&&-2     2 ABC   1 N JKLABC  0  CHARGE  
210&&-2     3 ABC   1 N MNOABC  0  CHARGE  
210&&-2     4 ABC   1 N PQRABC  0  CHARGE  
2130&&-4&-6&&-9   0 ABC   1 N DEFABC  0  CHARGE  
2130&&-4&-6&&-9   1 ABC   1 N GHIABC  0  CHARGE  
2130&&-4&-6&&-9   2 ABC   1 N JKLABC  0  CHARGE  
2130&&-4&-6&&-9   3 ABC   1 N MNOABC  0  CHARGE  
2130&&-4&-6&&-9   4 ABC   1 N PQRABC  0  CHARGE 
+1

+1 Это на самом деле сохраняет форматирование вывода – hek2mgl

+0

Ударьте мне :( –

+0

Это не учитывает 0 записей. Подумайте о том, что это произойдет после следующего пропущения записи, которую он устанавливает. –

1

Вы можете использовать это:

awk 'NF==8{m=$1}NF!=8{$0=m$0}1' the.file 

Однако он сломается выходное форматирование.

+1

похож на мой 'AWK '! А =/^/{$ 0 = х $ 0} а {х = $ 1} 1' File' –

+0

@Jidder Yours выглядит лучше (потому что он общий и не зависит от количества полей 8) – hek2mgl

+0

Большое спасибо hek2mgl !!! – VNA

3

Awk путь с форматированием сохранены

awk '/^ /{$0=(x)substr($0,21)}{x=substr($0,0,20)}1' file 

И еще один способ без необходимости длину полей (очень похоже с Томом feneches ответить)

awk '/^ /{$0=(x)substr($0,length(x)+1)}{x=$1}1' file 

Выход обоих

20      0 ABC   1 N DEFABC  0  CHARGE 
20      1 ABC   1 N GHIABC  0  CHARGE 
20      2 ABC   1 N JKLABC  0  CHARGE 
20      3 ABC   1 N MNOABC  0  CHARGE 
20      4 ABC   1 N PQRABC  0  CHARGE 
210&&-2     0 ABC   1 N DEFABC  0  CHARGE 
210&&-2     1 ABC   1 N GHIABC  0  CHARGE 
210&&-2     2 ABC   1 N JKLABC  0  CHARGE 
210&&-2     3 ABC   1 N MNOABC  0  CHARGE 
210&&-2     4 ABC   1 N PQRABC  0  CHARGE 
2130&&-4&-6&&-9   0 ABC   1 N DEFABC  0  CHARGE 
2130&&-4&-6&&-9   1 ABC   1 N GHIABC  0  CHARGE 
2130&&-4&-6&&-9   2 ABC   1 N JKLABC  0  CHARGE 
2130&&-4&-6&&-9   3 ABC   1 N MNOABC  0  CHARGE 
2130&&-4&-6&&-9   4 ABC   1 N PQRABC  0  CHARGE 
+0

Спасибо большое Jidder !!! – VNA

+0

+1 и я удаляю мой, так как ваш очень похож, просто избавляйтесь от переменной 'a' полностью, так как он не добавляет значения. –

+0

@EdMorton Как я должен избавиться от –

1
awk '/^[ \t]/ { sub(/^[ \t]+/, ""); print t $0; next } 
    { match($0, /^[^ \t]+[ \t]+/); t = substr($0, RSTART, RLENGTH) } 
    1' file 

Выход:

20      0 ABC   1 N DEFABC  0  CHARGE  
20      1 ABC   1 N GHIABC  0  CHARGE  
20      2 ABC   1 N JKLABC  0  CHARGE  
20      3 ABC   1 N MNOABC  0  CHARGE  
20      4 ABC   1 N PQRABC  0  CHARGE  
210&&-2     0 ABC   1 N DEFABC  0  CHARGE  
210&&-2     1 ABC   1 N GHIABC  0  CHARGE  
210&&-2     2 ABC   1 N JKLABC  0  CHARGE  
210&&-2     3 ABC   1 N MNOABC  0  CHARGE  
210&&-2     4 ABC   1 N PQRABC  0  CHARGE  
2130&&-4&-6&&-9   0 ABC   1 N DEFABC  0  CHARGE  
2130&&-4&-6&&-9   1 ABC   1 N GHIABC  0  CHARGE  
2130&&-4&-6&&-9   2 ABC   1 N JKLABC  0  CHARGE  
2130&&-4&-6&&-9   3 ABC   1 N MNOABC  0  CHARGE  
2130&&-4&-6&&-9   4 ABC   1 N PQRABC  0  CHARGE  
+1

Большое спасибо konsolebox !!! – VNA

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