columns to data matrix awk

Por lo que entiendo de su descripción y pregunta, parece estar interesado en una lista completa de propiedades que se utilizan en el marco Hadoop . Para el significado de cada propiedad, valores posibles, recomendados o buenos, me gusta recomendar hacer un seguimiento con la documentación del marco oficial.

1
10.05.2018, 15:19
2 ответа

Awk раствор:

awk 'BEGIN{
         h = "1 2 3 4 5 6 7 8 11 12 20 21";
         len = split(h, head);
         print "\t\t" h
     }
     {
         printf "%s\t", $1;
         for (i = 1; i <= len; i++)
             printf "%s%d", (i == 1? "" : OFS), ($2 ~ "\\<" head[i] "\\>");
         print "" 
     }' file
  • h = "1 2 3 4 5 6 7 8 11 12 20 21"-заголовок строка
  • len = split(h, head)-разбить строку hна массив head, где индексы — это упорядоченные позиции, начиная с 1, а значения — это ключевые значения, полученные путем разбиения; lenсодержит размер массива
  • print "\t\t" h-напечатать строку заголовка с начальными символами табуляции
  • printf "%s\t", $1;-распечатать 1-е поле$1
  • for (i = 1; i <= len; i++)-перебирать headэлементов
    • $2 ~ "\\<" head[i] "\\>"-проверить, содержит ли 2-е поле $2текущий доступный элементhead[i]

Выход:

        1 2 3 4 5 6 7 8 11 12 20 21
name1   1 1 0 1 0 0 0 1 0 0 0 0
name2   0 0 0 1 1 0 1 0 0 0 0 0
name3   0 0 0 0 0 0 0 1 0 0 0 0
name4   0 0 0 0 0 0 0 0 1 1 0 0
namex   0 0 0 0 0 0 0 0 0 0 1 1
2
28.04.2021, 23:47

Другой awkподход, который сначала генерирует заголовок сам по себе, а затем заполняет матрицу 1 для каждого ключа в массиве head, существует в текущей строке ввода, иначе 0 , если не существует.

Мы использовали grepдля получения только -oчисел, которые соответствуют пустой строке на левом краю числа\b(так же, как \<мы использовали в awkдля левой и правой сторон ).

awk 'NR==FNR { !head[$1]++; next } 
    { printf $1; for (x in head) { printf (x?FS:"") ($0 ~ "\\<" x "\\>") }; print ""
}' <(grep -o '\b[0-9]\+' infile) infile

Вывод:

name1 1 1 1 0 0 1 0 0 0 0
name2 0 0 1 1 1 0 0 0 0 0
name3 0 0 0 0 0 1 0 0 0 0
name4 0 0 0 0 0 0 1 1 0 0
namex 0 0 0 0 0 0 0 0 1 1

Вы можете сгенерировать заголовок и вставить его в первую строку входного файла,тогда awkбудет так же просто, как:

awk 'NR==1{ split($0, head); next }
    { printf $1; for (x in head){ printf (x?FS:"") ($2 ~ "\\<" head[x] "\\>" ) }; 
print "" }' infile
0
28.04.2021, 23:47

Теги

Похожие вопросы