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.
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
Другой 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