объединить строки одного файла на основе ключевых столбцов

У меня была такая же проблема на OSX El Capitan, и я решил ее, обновив rsync до версии 3.11. Проблема возникла у меня на версии 2.6.9.

0
15.08.2018, 20:39
3 ответа

Разве простое изменение местами двух grepне сделает то, что вы хотите, удалив строки precisionзаранее, чтобы они не совпадали со строками created_atво втором grep?

grep -v precision schema.rb | grep -A1 -B3 created_at 
create_table "things", id: :serial, force: :cascade do |t|
   t.string "other_column"
   #...
   t.datetime "created_at"
 end
0
28.01.2020, 02:42

Я не думаю, что то, что я пытался сделать, возможно, если я свяжу вместе 2 grepкоманды (, поскольку строки контекста относятся к каждой отдельной grepкоманде ).

Мне пришло в голову, что мне нужен негативный просмотр вперед. Тогда все это можно было бы сделать с помощью одной команды grep.

К моему удивлению, похоже, что GNU grepдействительно поддерживает regex lookbehind/lookahead, но только если вы используете опцию --perl-regex.

Вот команда grep, которая дает мне то, что я искал:

⟫ grep --perl-regexp 'created_at(?!(.*precision:))' schema.rb -B3
  create_table "things", id: :serial, force: :cascade do |t|
    t.string "other_column"
    #...
    t.datetime "created_at"
1
28.01.2020, 02:42

awk-решение

$ awk '/create_table/,/created_at/&&!/precision:/' schema.rb
  create_table "things", id: :serial, force: :cascade do |t|
    t.string "other_column"
    #...
    t.datetime "created_at"
  create_table "users", id: :serial, force: :cascade do |t|
    t.citext "email"
    #...
    t.datetime "created_at", precision: 0
  end
$

Ни один из приведенных ниже способов не дает точно того, что вам нужно, но я добавлю их, на случай, если они будут каким-то образом полезны.

решение sed, которое печатает строку таблицы create _и соответствие

Найдите строку таблицы create _, если она найдена, сохраните ее в буфере хранения 'h'. Ищите созданный _с указанием точности, если он найден, игнорируйте его. Ищите созданный _в одиночку, если найдете, распечатайте.

$ sed -n '/create_table/h;/created_at.*precision:/d;/created_at/{H;g;p}' schema.rb
  create_table "things", id: :serial, force: :cascade do |t|
    t.datetime "created_at"
$

awk-решение, которое печатает строку таблицы create _и соответствие

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

$ awk '/create_table/{t=$0}/created_at/&&!/precision:/{print t"\n"$0}' schema.rb
  create_table "things", id: :serial, force: :cascade do |t|
    t.datetime "created_at"
$

awk-решение, печатающее таблицу

Немного дальше: если вам нужны только имена таблиц, внутри которых есть совпадающая строка, вы можете использовать

$ awk '/create_table/{t=$2}/created_at/&&!/precision:/{print substr(t,2,length(t)-3)}' schema.rb
things
$
0
28.01.2020, 02:42

Теги

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