2017-02-17 39 views
3

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

  1. Если строка имеет 2 поля, первый столбец (100), а второй столбец (2) представляет пары «X» строк, которые следуют
  2. Если строка, соответствующая NR + (2 * X -1), начинается с «B», второй столбец этой строки печатается
  3. Если соответствующая строка для NR + (2 * X -1) не начинается с «B», печатается значение «0».

Пример файла:

100 2 
A .5 .4 
.3 .2 .1  
B .9 .8 
.7 .6 .65 
200 1 
A .5 .4 
.3 .2 .1 

Идеальный выход:

100 .9 
200 0 

Код Таким образом Far:

awk '{if(NF==2) print $1;}' 

Который производит:

100 
200 
+0

Вы должны показать, что вы пробовали уже. –

+0

Я не специалист по awk, но, пожалуйста, включите эту информацию в свой пост. Это поможет кому-то определить, как вам помочь. –

ответ

0

Вот некоторые awk код, чтобы удовлетворить ваши требования:

Код:

#!/bin/awk -f 
{ 
    # skip some lines if needed 
    if (to_skip-- > 0) next; 

    # if we don't have a header, keep the section number as record count 
    if (! have_header) { 
     header = $1; 
     have_header = 1 

     # skip some records 
     to_skip = $2 * 2 - 2; 
     next; 
    } 

    # if the first character is a 'B' get the second column  
    if ($1 == "B") 
     value = $2; 
    else 
     value = 0 

    # print the output, move to the next header 
    print header, value 
    have_header = 0; 
    to_skip = 1 
} 

Выход:

$ awk -f test.awk data.txt 
100 .9 
200 0 
4

Входной

$ cat f 
100 2 
A .5 .4 
.3 .2 .1  
B .9 .8 
.7 .6 .65 
200 1 
A .5 .4 
.3 .2 .1 

Выход

$ awk 'NF==2{t=$1; l=(NR+2*$2-1)}NR==l{print t,/^B/?$2:0}' f 
100 .9 
200 0 

Объяснение

awk 'NF==2{     # If row has 2 fields 
      t=$1    # lets save 1st field and print later 
      l=(NR+2*$2-1)  # line to be checked 
    } 
    NR==l{   # if current record number is equal to l 

      # Print t, if starts with B then field 2 to be printed else 0 
      print t,/^B/?$2:0 
    } 
    ' f