awk с пустым полем в столбцах - PullRequest
0 голосов
/ 10 февраля 2019

Здесь мой file.dat

1   A 1 4
2     2 4
3   4 4
3     7 B
1   U 2

Бег awk '{print $2}' file.dat дает:

A
2
4
7
U

Но я бы хотел оставить пустое поле:

A

4

U

Как это сделать?

Я должен добавить, что между:

  • столбец 1 и 2 есть 3 пробела, разделитель полей

  • столбцы 2 и 3 и между столбцами 3 и 4 один разделитель пробельных полей

Таким образом, в столбце 2 отсутствуют 2 поля (строки 2 и 4), а в столбце 4 также есть2 поля пропущены (строки 3 и 5)

Ответы [ 4 ]

0 голосов
/ 11 февраля 2019

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

awk '{ print(substr($0,5,1)) }' file
0 голосов
/ 11 февраля 2019

В вашем awk коде отсутствуют разделители полей.

В вашем примере файла не совсем ясно, что это за разделитель полей.

По наблюдениям ваш файл имеет 5 столбцов.

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

В этом примере кода ожидается \t, что означает <TAB> в качестве разделителя полей.

awk -F'\t' '{print $3}' OFS='\t' file.dat

Выводит 3-й столбец из файла.Это разделитель «read in» -F'\t', а OFS='\t' - «read».

A

4

U
0 голосов
/ 11 февраля 2019

Для GNU awk.Он обрабатывает файл дважды.В первый раз он проверяет все записи, для которых строковые индексы имеют только пробел, и рассматривает непрерывные последовательности пробелов в качестве строк-разделителей, образующих FIELDWIDTHS переменную .Во второй раз он использует это для обработки данных с фиксированной шириной.

a[i]: s получает значение 0/1 и h (заголовок) с этим вводом будет 100010101, что приводит к FIELDWIDTHS="4 2 2 1":

1   A 1 4
2     2 4
3   4 4
3     7 B
1   U 2
|   | | |
100010101 - while(match(h,/10*/))
 \ /|/|/|     
  4 2 2 1

Сценарий:

$ awk '
NR==FNR {
    for(i=1;i<=length;i++)                              # all record chars
        a[i]=((a[i]!~/^(0|)$/) || substr($0,i,1)!=" ")  # keep track of all space places
    if(--i>m)
        m=i                                             # max record length...
    next
}
BEGINFILE {
    if(NR!=0) {                                         # only do this once
        for(i=1;i<=m;i++)                               #  ... used here
            h=h a[i]                                    # h=100010101
        while(match(h,/10*/)) {                         # build FIELDWIDTHS
            FIELDWIDTHS=FIELDWIDTHS " " RLENGTH         # qnd
            h=substr(h,RSTART+RLENGTH)                       
        }
    }
}
{ 
    print $2                                            # and output 
}' file file

И вывод:

A

4 

U 

Однако вам нужно обрезать пространство по полям.

0 голосов
/ 11 февраля 2019

Если это не все, что вам нужно:

$ awk -F'[ ]' '{print $4}' file
A

4

U

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

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