Сравните каждую n-ю строку в 2 файлах и сохраните (асимметричный) контекст

. Вы можете захватить код выхода в переменную:

cd some/path; gnuplot -e gnuplot_file.gp ; a=$?

вернуться в предыдущий каталог (без вывода на консоль):

cd -- "$OLDPWD"

Вывести код выхода

А затем вывести захваченный код выхода (полную строку):

cd some/path; gnuplot -e gnuplot_file.gp ; a=$?; cd -- "$OLDPWD"; echo "$a"

Если вам нужно пересоздать код выхода, есть много возможных способов:

[ "x$a" == 'x0' ]
[ "$a" -eq 0 ]
[ ! "${a#0}" ]
[[ $a == 0 ]]
[[ $a -eq 0 ]]

Рекомендуется не использовать "${a#1}", так как код выхода из ошибки может быть любым числом, кроме 1. Не гарантируется, что a будет 1 для ошибки.

Или, поскольку a - это число, если вы хотите использовать арифметическое решение (bash):

(( a == 0 ))
! (( a ))
(( ! a ))

Пересоздайте код выхода...

Полная строка будет такой:

cd some/path; gnuplot -e gnuplot_file.gp ; a=$?; cd -- "$OLDPWD"; (( ! a ))

Код выхода будет 0 или 1, все ошибки будут сообщены с кодом выхода 1.


Полный код выхода

Выход exit "$a" полезен только в случае завершения выполнения скрипта.
Поймите, что при этом будет сохранен фактический код выхода.

 cd some/path && gnuplot -e gnuplot_file.gp ; a=$?; cd -- "$OLDPWD"; exit "$a"

Возврат 'return "$a"' может быть полезен, если используется внутри функции.

function_gnuplot(){
    cd some/path && gnuplot -e gnuplot_file.gp ; a=$?
    cd -- "$OLDPWD"; return "$a"
}
1
16.03.2019, 04:38
2 ответа

Вот скрипт Python, который должен делать то, что вы хотите:

#!/usr/bin/env python3
# -*- encoding: utf-8 -*-
"""compare.py"""

import sys

file_A = open(sys.argv[1], "r")
file_B = open(sys.argv[2], "r")

records_A = file_A.read().split("\n\n")
records_B = file_B.read().split("\n\n")

for record_A, record_B in zip(records_A, records_B):
    lines_A = record_A.split("\n")
    lines_B = record_B.split("\n")
    if lines_A[2] != lines_B[2]:
        print("{}\n".format(record_B))

Вы бы запустили это так:

python compare.py fileA fileB

Когда я запускаю его на вашем примере данных, я получаю желаемый результат:

record2 line1=header
record2 line2
record2 line3 id GHI <= this is different
record2 line4
3
27.01.2020, 23:14

Для вашего обновленного ввода, основанного строго на 4-х -строковых записях, вы можете использовать арифметику по модулю для поддержки массивов текущих записей и проверять 3-е строки на соответствие каждой 4-й строке:

$ awk '
    {a[FNR%4] = $0; getline b[FNR%4] < "fileB"} 
    !(FNR%4) && b[3] != a[3] {
      for(i=0;i<4;i++) print b[i%4]
    }
  ' fileA
record2 line1=header
record2 line2
record2 line3 id GHI <= this is different
record2 line4

(обратите внимание, что на самом деле следует проверить возвращаемое значение команды getlineи сделать что-то разумное, если она не удалась ).


Для исходного -опубликованного ввода вы могли использовать режим абзаца:

$ awk -vRS= -F'\n' '{A3 = $3}; getline "fileB" > -1 && $3 != A3' fileA
record2 line1=header
record2 line2
record2 line3 id DEF <= this is different
record2 line4

Пустой RSприводит к чтению целых пустых -записей, разделенных строками, как для нормальной обработки (, вводимых из fileA), так и для getline(, вводимых из fileB). Установка разделителя полей на новую строку(\n)позволяет нам сохранить всю строку $3из одного и сравнить с другим. Если они не равны, по умолчанию выводится $0(, который представляет собой всю запись из getlineиз fileB).

3
27.01.2020, 23:14

Теги

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