как найти общий номер из нескольких файлов?

Необходимо использовать 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

Возможно, вы сможете настроить это через систему конфигурации вашего дистрибутива, но то, как это сделать, зависит от используемого дистрибутива.

2
24.01.2020, 11:44
5 ответов

Предположим, что каждое число может встречаться в файле только один раз:

$ awk '{c[$1]++} END{for (i in c) if (c[i] == (ARGC-1)) print i}' a.txt {1..2}.txt
3
6
7
1
27.01.2020, 22:16

Во-первых, чтобы узнать, что для того, чтобы 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 файлов.

0
27.01.2020, 22:16

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вы также можете использовать оператор >на некоторых системах (запись в файл с перезаписью)

0
27.01.2020, 22:16

Ваша проблема связана с перезаписью вывода на каждой итерации. >перенаправление обрезает(пустой )файл, в который вы перенаправляете.

Другой подход. :Сортируйте каждый файл по отдельности с помощью 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
0
27.01.2020, 22:16

Помимо других проблем, ваш цикл скрипта вызывает comm10000 раз, что делает его очень медленным. Более быстрая альтернатива — отсортировать их все и подсчитать повторы.Строки, количество которых равно количеству файлов, существуют во всех файлах (, если значения внутри каждого файла не повторяются):

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

В котором будут перечислены все файлы с повторяющимися номерами, и будет отсортирован каждый отдельный файл.

0
27.01.2020, 22:16

Теги

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