Intereting Posts
apt-get не работает на kali linux v2.0 Как найти смещение файловой системы ext4? Настройка стороннего sftp-сервера для работы на порту 22 Легкий / простой метод ввода, который работает с минимальным оконным менеджером? Как остановить веб-сайты от буферизации и автовоспроизведения видео в Firefox? Существуют ли какие-либо дистрибутивы Linux, специально предназначенные для нетбуков? Звуковой сигнал при вводе обратной косой черты в обычном режиме cvim Установка жесткого диска USB 2.0 с несколькими разделами (GPT / HFS +) на Debian Как безопасно убивать процессы, чтобы перенаправление вывода не прерывалось? Ошибка «Ошибка устройства или ресурса» при попытке записи звука с использованием iscord Caps + shift + {w / s / x} не работает в gnome Удаление / удаление вложений с сервера электронной почты (IMAP) Сохранение данных в именованном канале после неполного доступа на чтение Можно ли определить чувствительные к каталогу псевдонимы в zsh (или любой другой оболочке)? Кластер Mariadb не запускается при перезагрузке

Сравните 2 файла с разделителями табуляции и выходных различий с заголовком столбца

Я хотел бы сравнить 2 похожих файла на общем столбце. Файлы будут иметь одинаковые заголовки.

file1.txt

 mem_id Date Time Building aa bb cc dd ee ff gg hh ii jj kk ll 

file2.txt

 mem_id Date Time Building aa bb cc dd ee ff 2g hh ii jj kk 2l 

Command

 awk 'NR==FNR{for(i=1;i<=NF;i++){A[i,NR]=$i}next} {for(i=1;i<=NF;i++){if(A[i,FNR]!=$i)\ {print "ID#-"$1": Column",i"- File1.txt value=",A[i,FNR]" / File2.txt value= "$i}}}'\ file1.txt file2.txt 

Current Output

 ID#-ee: Column 3- File1.txt value= gg / File2.txt value= 2g ID#-ii: Column 4- File1.txt value= ll / File2.txt value= 2l 

Desired Output

 mem_id#-ee: Time- file1.txt value= gg / file2.txt value= 2g mem_id#-ii: Building- file1.txt value= ll / file2.txt value= 2l 

Я очень близок. Но я хотел бы помочь с некоторыми улучшениями.

1- Я хотел бы заменить «Столбец 3» и «Столбец 4» фактическим заголовком столбца («Время», «Строительство», что угодно)

2- Я хотел бы динамически собирать имена файлов в выводе и не добавлять их как часть команды (чтобы сделать ее универсальной)

3- Мне хотелось бы, чтобы этот сценарий.

Любая помощь будет оценена по достоинству.

Использование awk :

 awk ' NR==1 { for (i=1; i<=NF; i++) header[i] = $i } NR==FNR { for (i=1; i<=NF; i++) { A[i,NR] = $i } next } { for (i=1; i<=NF; i++) if (A[i,FNR] != $i) print "ID#-" $1 ": " header[i] "- " ARGV[1] " value= ", A[i,FNR]" / " ARGV[2] " value= "$i }' file1.txt file2.txt 

Вывод:

 ID#-ee: Time- file1.txt value= gg / file2.txt value= 2g ID#-ii: Building- file1.txt value= ll / file2.txt value= 2l 

Вот сценарий, который, я думаю, выполняет эту работу:

 #! /bin/bash FILE1=$1 FILE2=$2 [[ -z $FILE1 || -z $FILE2 ]] && echo "USAGE: $0 FILE1 FILE2" && exit 1 join -j 1 $FILE1 $FILE2 | awk ' NR == 1 { for (i = 1; i <= NF; i++) { header[i] = $i; }; NCOLS = (NF - 1)/2; } NR > 1 { for (i = 2; i <= NCOLS + 1; i++) { if ($i != $(i+NCOLS)) {print header[1]"#-"$1": "header[i]"- '$FILE1' value=",$i" / '$FILE2' value= "$(i+NCOLS) } } } ' 

Я применил join в файлах, чтобы я мог их прочитать за один раз.

С NR == 1 , я читаю в первой строке массив (так что я могу повторно использовать их позже.

Поскольку я использовал join , если оба файла имели n столбцов, объединенный вывод имеет 2n-1 столбца (столбцы, используемые для объединения, объединяются). Поэтому я сохраняю количество столбцов (дисконтирование общего столбца) до NCOLS .