Сравните строки и обновите два разных файла

Наконец-то нашел ответ от кого-то другого на другом сайте, просто обнулил иноды и перепроверил систему, вот и все!

debugfs -w /dev/sda2
:clri <1415>
:clri <1416>
:clri <1417>
:q
fsck -y /dev/sda2

Для всех остальных, кто столкнулся с этой проблемой, я нашел плохие inodes, используя find на плохом монтировании, затем проверил dmesg на наличие ошибок на плохих inodes.

4
16.06.2016, 12:50
2 ответа

1) Is it possible to merge this way the files through an appropriate bash script?

При условии:

  • file_2в основном file_1с добавленными и удаленными строками , но не перемещенными и
  • ни один из файлов не содержит символов табуляции,

GNU diffдает ключ к простому решению:

#!/usr/bin/env bash
diff -y "$1" "$2" | while IFS=$'\t' read s1 s2 s3; do
  if [[ $s1 == *\> ]]; then
    # New line from second file
    echo "$s2"
  else
    case "$s2" in
      *\|) # Changed line, so...
        echo "$s1"
        echo "$s3"
      ;;
      *) # Output first file
        echo "$s1"
      ;;
    esac
  fi
done

Это отправляет унифицированный вывод на стандартный вывод, где вы можете делать с ним все, что захотите. Я предлагаю сначала проверить вывод, вместо того, чтобы слепо перезаписывать как file_1, так и file_2.

(Если вам интересно, как это работает, запустите diff -y file_1 file_2 | cat -A, чтобы увидеть, что на самом деле содержится в выводе diff.)

2) Is it possible to do the same, when instead of lines I have paragraphs, that is: blocks of lines?

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

  • Сохранить исходные абзацы. Прочитайте каждый абзац из правильного файла и выведите его. Это упражнение для вас.
  • Создать новые абзацы. Каждый echoв приведенном выше скрипте становится echo... | fmt -w<desire_line_width>.
0
27.01.2020, 21:03

Это проблема по существу выполнения2 -двухстороннегоилидвунаправленного -слияниямежду двумя файлами с синхронизацией различий между ними. Мой собственный -случай использования для этого заключался в выполнении обновлений в репозитории GitHub и сохранении уникальных данных в файле переменных, чтобы предотвратить повторное -их включение при каждом обновлении!

Сначала я покажу вам выражение и используемые тестовые данные, чтобы вы могли воссоздать результаты для проверки(просто измените разделитель полей с '=' на пустое место ' ' для вашего набора данных):

 paste -d'\n' file1.txt file2.txt|awk -F'=' '!seen[$1]++' > file3.txt

Мои тестовые данные выглядят так:

файл1.txt:

LineA='value1'
LineB='value2'
LineC='value3'
LineD='value4'
#
LineE='value5'
LineF='value6'
#
LineG='value7'
#
LineH='value8'

файл2.txt:

LineA=''
LineB=''
NEWVARIABLE1='This only Exists in file2.txt Under LineB'
LineC=''
LineD=''
#
LineE=''
NEWVARIABLE2='This only Exists in file2.txt Under LineE'
LineF=''
#
LineG=''
#
LineH=''
NEWVARIABLE3='This only Exists in file2.txt under LineH'

Выход:

paste -d'\n' file1.txt file2.txt|awk -F'=' '!seen[$1]++' > file3.txt

Комбинированный файл3.txt выглядит так:

LineA='value1'
LineB='value2'
LineC='value3'
NEWVARIABLE1='This only Exists in file2.txt Under LineB'
LineD='value4'
#
LineE='value5'
LineF='value6'
NEWVARIABLE2='This only Exists in file2.txt Under LineE'
LineG='value7'
LineH='value8'

NEWVARIABLE3='This only Exists in file2.txt under LineH'

Обратите внимание, что в файле 2 .txt все значения пусты ('' ), кроме значенийNEWVARIABLEx . Просмотрев вывод, вы можете увидеть, что все уникальные данные из файла 1 .txt были сохранены после слияния.

Также обратите внимание, что каждое новое «переменное» понижение добавляет в файл2.txt («обновляемый» файл )на 1 строку в объединенном файле3.txt. Таким образом, если вы добавите 4 новые переменные в файл 2.txt, в объединенном файле 3.txt ЧЕТВЕРТАЯ новая переменная будет на 4 строки ниже в файле 3.txt. Однако в моем случае использования это не проблема.

К сожалению, это сработает в вашем ПЕРВОМ случае использования -при выполнении2 -слияния файлов. Однако, если вы снова добавите непрерывный блок теста в файл2.txt (, «обновленный файл )будет чередоваться с окружающими строками из файла 1 .txt в объединенном файле 3 .txt Итак, я понял вас наполовину, но мой вариант использования совпадает с вашим только в первой части вашего вопроса.

Я испробовал множество различных решений, предложенных другими авторами на этом и других форумах.но это был действительно единственный, кто делал бизнес. ХТХ-

0
27.01.2020, 21:03

Теги

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