уникальное имя кластера

Если я правильно понял, вы собираетесь сопоставить идентификаторы в столбце 1 из файла A.txt с идентификаторами в столбце 23 в файле B.txt и, если совпадают, напечатать столбец 23 из файла B.txt, если нет, отредактируйте ваш вопрос с более подробной информацией.

Я предполагаю, что ваши файлы выглядят так:

==> fileA.txt <==
1111 column2 column3 column4...
2222 c1 c2 c3 c4...
4444 co1 co2 co3 co4...
3333 col1 col2 col3 col4...

==> fileB.txt <==
c11... c22 3333 c24 c25
co11... co22 0000 co24 co25
col11... col22 4444 col24 col25

тогда команда будет выглядеть следующим образом:

awk 'NR==FNR {seen[$1]++;next;} ($23 in seen){print $23}' fileA.txt fileB.txt

вывод из файла B.txt

c11
col11

1
18.10.2019, 16:24
3 ответа

Вы можете отфильтровать все строки с помощью grep, используя регулярное выражение.

grep '[a-z-]1\?\.domain_name' file > newfile

Это возвращает все строки с буквами или минусом и необязательным 1перед «.domain _name».


Обратной операцией будет удаление всех строк, содержащих числа > 1, перед «.domain _name»:

grep -v '\([2-9]\|[0-9]1\)\.domain_name' file > newfile

Соответствует строкам с цифрами от 2 до 9 в качестве последней цифры перед ".domain _name" или числам, состоящим как минимум из двух цифр, где последняя цифра1(соответствует 11 или 21 и т. д. ). Опция -vиспользуется для выбора строк, не соответствующих -.

1
27.01.2020, 23:40

Если вы не можете быть уверены, что каждый кластер содержит хост с номером 1, вам нужно отслеживать кластеры, которые вы уже видели. Вawk(среди прочего )вы можете сделать это с помощью ассоциативного массива:

awk '{o=$0; sub(/[0-9]+/,"",o)} !a[o]++ {print}' file
0
27.01.2020, 23:40

Ответ Фредди дает только первый узел из каждого. Хотя это может быть все, что вам нужно, вместо этого выбирается случайный узел из каждого кластера.

# iterate through unique list of cluster stub names, assuming a digit marks the node number
for cluster in $(sed -e 's/.domain_name//' serverlist|tr -d '[[:digit:]]'|sort -u)
  do
  # for this cluster, get the list of all node names if indexed
  nodes=( $(grep $cluster'[[:digit:]]' serverlist) )
  # if there wasn't a match it's because it's a cluster of one without a node number
  if (( ${#nodes[@]} == 0 )); then
    # cluster of one
    echo $cluster
  else
    # pick a random number from 1 to number of nodes
    # subtract one to make it an array index
    n=$(( $(shuf -i"1-${#nodes[@]}" -n1) -1 ))
    echo ${nodes[$n]}
  fi
done
0
27.01.2020, 23:40

Теги

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