Необходимо использовать IP-адрес шлюза, назначенный сетевым администратором, иначе вы не сможете выйти в Интернет. Они смогут сказать вам (, что обычно это номер с наименьшим номером, который здесь действительно тот, у которого 17 в конце ).
Что касается того, что вы используете на своем сервере, это полностью зависит от вас! Можно использовать любой из «используемых» адресов, не являющийся шлюзом, и он будет работать. Вы можете назначить несколько IP-адресов своему серверу, если хотите, или вы можете связать вторичные IP-адреса с виртуальными машинами или контейнерами или чем-то подобным. Неистовствовать!
Чтобы назначить более одного IP-адреса одному и тому же интерфейсу, не следует больше использовать псевдонимы; такой способ ведения дел устарел целую вечность. Вместо,вы должны просто назначить несколько адресов одному и тому же интерфейсу:
ip ad add xxx.xxx.xxx.17/29 dev eth0
ip ad add xxx.xxx.xxx.18/29 dev eth0
Возможно, вы сможете настроить это через систему конфигурации вашего дистрибутива, но то, как это сделать, зависит от используемого дистрибутива.
Предположим, что каждое число может встречаться в файле только один раз:
$ awk '{c[$1]++} END{for (i in c) if (c[i] == (ARGC-1)) print i}' a.txt {1..2}.txt
3
6
7
Во-первых, чтобы узнать, что для того, чтобы comm
правильно сообщать об общих строках среди нескольких файлов, вам нужно будет передавать входные файлы как отсортированные, если они еще не отсортированы ранее.
Во-вторых, вам нужно изменить команду mv
на mv final.txt a.txt
; чтобы сверить следующий файл с результатом предыдущей попытки; здесь я взял резервную копию из a.txt
и использовал вместо нее common.txt
для итерации в цикле for -.
так что у вас будет окончательный сценарий, как показано ниже:
cp a.txt common.txt
for ((i=1;i<=10000;i++));
do comm -12 <(sort common.txt) <(sort $i.txt) >temp.txt;
mv temp.txt common.txt;
done
наконец, cat common.txt
будут те строки, которые являются общими среди 10000 файлов.
comm
только для отсортированных файлов,
Compare sorted files FILE1 and FILE2 line by line.
источник:https://linux.die.net/man/1/comm
поэтому алгоритм не будет работать для несортированных файлов. Это работает:
#!/bin/sh
sort -n a.txt > tmp.txt
END=4
for i in `seq 2 $END`
do
comm -12 --nocheck-order tmp.txt $i.txt |tee tmp.txt
done
cp tmp.txt "final.txt"
Вместо |tee
вы также можете использовать оператор >
на некоторых системах (запись в файл с перезаписью)
Ваша проблема связана с перезаписью вывода на каждой итерации. >
перенаправление обрезает(пустой )файл, в который вы перенаправляете.
Другой подход. :Сортируйте каждый файл по отдельности с помощью sort -u
, чтобы получить записи, уникальные для этого файла, затем объединяйте результаты этих операций сортировки и пропускайте их через sort | uniq -c
, чтобы получить сумму количества раз, когда каждый запись появляется во всех файлах. Затем просмотрите этот результат и выберите записи, количество которых равно количеству файлов. Это записи, которые встречаются во всех файлах.
set --./*.txt
for file do
sort -u "$file"
done | sort | uniq -c |
awk -v c="$#" '$1 == c { print $2 }'
Здесь я использую позиционные параметры, устанавливая их в список файлов, которые мы хотели бы перебрать с помощью set --./*.txt
. Я делаю это для того, чтобы мы могли использовать $#
позже, то есть количество файлов в списке.
Для трех первых наборов данных, которые вы показываете, это выведет
3
6
7
Помимо других проблем, ваш цикл скрипта вызывает comm
10000 раз, что делает его очень медленным. Более быстрая альтернатива — отсортировать их все и подсчитать повторы.Строки, количество которых равно количеству файлов, существуют во всех файлах (, если значения внутри каждого файла не повторяются):
set --./*.txt
sort -n "$@" | uniq -c | awk -vcount="$#" '$1==count{print $2}'
Я использую позиционные аргументы, чтобы получить как список файлов "$@"
, так и количество файлов $#
.
Сортировка числовая -n
, так как вы запрашиваете номер .
Вы можете проверить(и отсортировать ), что ни в одном файле нет повторяющихся номеров с помощью:
set --./*.txt
for f; do
sort -n "$f" > "$f.tempfile"
mv "$f.tempfile" "$f"
if [ "$(uniq -d "$f")" != "" ]; then echo $f; fi
done
В котором будут перечислены все файлы с повторяющимися номерами, и будет отсортирован каждый отдельный файл.