. Вы можете захватить код выхода в переменную:
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"
}
Вот скрипт 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
Для вашего обновленного ввода, основанного строго на 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
).