Сравнение первого столбца в разных файлах

Я хочу сравнить один файл с другими файлами в том же каталоге.

file1.txt содержит:

 move 34#123# get 11#278 put 33#29#567#23 

file1.txt следует сравнивать с файлами 1.txt и 2.txt .

1.txt содержит:

 move 11 put 34 run 13 

2.txt содержит:

 get 14 move 66 

Мне нужно, чтобы результаты были такими:

 move 2 get 1 put 1 

Как я могу это сделать?

3 Solutions collect form web for “Сравнение первого столбца в разных файлах”

Вот решение awk :

 $ awk 'FNR==NR{a[$1];next}($1 in a){++a[$1]} END{for(i in a){print i" "a[i]}}' file1.txt 1.txt 2.txt put 1 get 1 move 2 

объяснение

  • FNR==NR{a[$1];next} : при обработке file1.txt мы file1.txt появление $1 в ассоциативном массиве a .
  • ($1 in a){++a[$1]} : при обработке 1.txt и 2.txt мы проверяем, существует ли $1 в ассоциативном массиве a , если да, увеличивая счет на 1.
  • Наконец, перейдем через ассоциативный массив a , напечатаем ключ (первое поле в файлах) и его значение (количество ошибок в 1.txt и 2.txt ).

Вот еще одно решение в perl , с той же логикой:

 $ perl -alne '++$i; if ($. == $i) { $h{$F[0]}=0; close ARGV if eof; next; } ++$h{$F[0]} if defined $h{$F[0]}; END { for (keys %h) { print $_." ".$h{$_}; } }' file1.txt 1.txt 2.txt move 2 get 1 put 1 

Показывая альтернативу, в которой используются различные инструменты, grep , awk , sort , & uniq . Конечно, он использует больше инструментов, но мне легче понять, что происходит против AWK.

 $ for i in 1.txt 2.txt; do grep -f <(awk '{print $1}' $i) file1.txt; done | \ awk '{print $1}' | sort | uniq -c 

пример

 $ for i in 1.txt 2.txt; do grep -f <(awk '{print $1}' $i) file1.txt; done | \ awk '{print $1}' | sort | uniq -c 1 get 2 move 1 put 

Как это работает

Вот пример, немного развернутый.

 $ for i in 1.txt 2.txt; do grep -f <(awk '{print $1}' $i) file1.txt done | \ awk '{print $1}' | sort | uniq -c 

Цикл for проходит через 2 файла, которые мы сопоставляем, 1.txt и 2.txt . Каждый раз через цикл мы используем первый столбец из одного из этих файлов в виде статического набора строк для поиска grep в нашем целевом файле file1.txt . Это строка, которая делает это:

 $ grep -f <(awk '{print $1}' $i) file1.txt 

После запуска с использованием каждого файла из цикла for мы берем весь этот вывод и выбираем только первый его столбец:

 move put move get 

Затем мы используем sort и uniq для подсчета количества всех типов, которые мы видели.

Вот еще один способ join :

 join -1 1 -2 2 -o 0 2.1 <(sort -k1,1 file1.txt) <(cut -d ' ' -f1 1.txt 2.txt | sort | uniq -c) 

обратите внимание, что результат будет отсортирован:

 get 1 move 2 put 1 

Если вы хотите сохранить заказ из file1.txt например

 move 2 get 1 put 1 

вы можете запустить:

 join -j2 -o 1.1 0 2.1 <(nl -ba -nrz file1.txt | sort -k2,2) \ <(cut -d ' ' -f1 1.txt 2.txt | sort | uniq -c) | sort -k1 | cut -d ' ' -f2- 
  • Объединение двух файлов данных на основе сравнения столбцов
  • Присоединить (большие) файлы по алфавитно-цифровому шаблону
  • Как присоединиться к двум файлам, сопоставляя столбцы с неправильным количеством столбцов?
  • Присоединить два несортированных файла к POSIX?
  • Элегантный способ подсчета, сколько раз шаблоны из файла встречаются в другом файле
  • Как обновить три файла CSV на основе четвертого файла
  • Найти общие элементы в данном столбце из двух файлов и вывести значения столбцов из каждого файла
  • Найти несколько совпадений в табличном файле и распечатать второй столбец?
  • объединить файлы csv по первому столбцу
  • присоединить несколько строк на основе столбца1
  • Усеченный результат, возвращаемый JOIN
  • Interesting Posts

    Отображение уникальной сети или веб-диска для каждого пользователя в Linux

    Можно ли переименовать процесс, который у вас есть из-за пределов этого процесса?

    Почему установка Linux не работает на этом компьютере?

    Список запросов серверов для выделенной памяти / процессора

    Временная метка каждой строки на экране GNU

    Аккумулятор никогда не прекращает зарядку

    Обновление / установка несистемно-важных приложений

    Создание значимых сообщений об объявлении эткриптора

    Сетевой накопитель Mount Freecom Classic SL (NDAS) в Ubuntu 11.10

    Как запустить приложение сверху, в диспетчере отображения, таком как GDM. (RHEL 7, Gnome 3.8.4)

    Делает что-либо USE / dev / initctl или / run / initctl

    Список ссылок на изображения на сайте wget

    Как создать скрипт в /etc/init.d?

    Как я могу привязать strace к процессу, который не находится в выходе ps?

    vi – как добавить определенные символы в конце строки

    Linux и Unix - лучшая ОС в мире.