Если я правильно понял, вы собираетесь сопоставить идентификаторы в столбце 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
Вы можете отфильтровать все строки с помощью 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
, вам нужно отслеживать кластеры, которые вы уже видели. Вawk
(среди прочего )вы можете сделать это с помощью ассоциативного массива:
awk '{o=$0; sub(/[0-9]+/,"",o)} !a[o]++ {print}' file
Ответ Фредди дает только первый узел из каждого. Хотя это может быть все, что вам нужно, вместо этого выбирается случайный узел из каждого кластера.
# 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