Как сравнить два файла и отображение в формате таблицы

У меня был тот же вопрос, и я впервые нашел этот ответ . Установил утилиту z ( https://github.com/rupa/z ).

Это именно то, что вы ищете, потому что z учится с ваших команд cd и отслеживает каталоги в соответствии с принципом frecency (часто и недавно). Итак, после того, как вы выполните обе команды cd один раз, вы можете сделать что-то вроде:

z docs
z ds

, чтобы перейти к / Project / Warnest / docs / и ~ / Dropbox / Projects / ds / test / соответственно. Аргументы для z - это регулярные выражения, поэтому вам даже не нужно вводить полное имя папки.

-1
14.02.2019, 10:20
2 ответа
  1. cat file1| awk -F "-" '{print $2}'| sed "s/\.[a-z].*//g">file_1_final.txt
  2. cat file2| awk -F "-" '{print $2}'| sed "s/\.[a-z].*//g">file_2_final.txt
  3. paste file_1_final.txt file_2_final.txt | sed '1i file1 file2' >combined_file1_file2
  4. awk -F "-" 'NR==FNR{a[$1];next}($1 in a){print $1}' file1 file2>>common_difference_file_1_2
  5. awk -F "-" 'NR==FNR{a[$1];next}!($1 in a){print $1}' file1 file2>>common_difference_file_1_2
  6. sed -i '1i name' common_difference_file_1_2
  7. paste common_difference_file_1_2 combined_file1_file2

Выход:

name    file1     file2
ap  2.21.3  2.35.3
bp  3.42.4  3.43.4
cp  3.23.2  4.33.2
dp      4.52.4
1
28.01.2020, 05:09

Судя по вашим комментариям, имена файлов можно описать так:

  • версия программы состоит из цифр, точек и дефисов и предваряется дефисом
  • имена программ состоят из всех символов до дефиса
  • номер версии отделяется от следующего блока точкой, за которой следует буква

С помощью этой информации можно использовать sedдля преобразования имен в таблице для каждого файла, содержащей только имя программы и номер версии:

$ sed -n 's|^\(.\+\)-\([0-9.-]\+\)\..*|\1 \2|p' file1.txt 
$ sed -n 's|^\(.\+\)-\([0-9.-]\+\)\..*|\1 \2|p' file2.txt 

Затем можно использовать awkдля сбора имен программ в двух файлах, сохранения версии каждой программы в каждом файле и печати сводной таблицы:

$ awk -v FS=" " -v OFS="\t" ' \
    { program[$1]++; } \
    NR==FNR { f1[$1] = $2; next; } \
    { f2[$1] = $2; } \
    END { for(i in program) print i, f1[i], f2[i]; }' \
   <(sed -n 's|^\(.\+\)-\([0-9.-]\+\)\..*|\1 \2|p' file1.txt) \
   <(sed -n 's|^\(.\+\)-\([0-9.-]\+\)\..*|\1 \2|p' file2.txt)
0
28.01.2020, 05:09

Теги

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