Как объединить строки с фиксированным интервалом в файле?

Попробуйте использовать nginx_cookie_flag_module . Это решит вашу проблему.

Заявление об ограничении ответственности: Я являюсь автором модуля.

4
26.09.2016, 21:37
4 ответа

Если вы используете GNU / что-нибудь, а количество строк кратно 9, вы можете запустить

split -l9 --filter='pr -3 -s" " -t' infile

Это разбивает входные данные разбиваются на части по девять строк, и каждая часть направляется в pr -3 -s "" -t ', который помещает его в столбец ... В зависимости от номера. строк и их длины вам может потребоваться поиграть с параметрами pr -w и -l . См. Дополнительную информацию на странице man .

11
27.01.2020, 20:44

Вот упрощенное решение в awk, жестко запрограммированное для извлечения трех наборов с трехстрочными интервалами:

{
  if (NR > 1 && (NR % 9) == 0) {
    print a "\n" b "\n" c " " $0
    a=""
    b=""
    c=""
  } else if (NR % 3 == 1) {
    if (NR % 9 > 1) {
      a=a" "$0
    } else {
      a=$0
    }
  } else if (NR % 3 == 2) {
    if (NR % 9 > 2) {
      b=b" "$0
    } else {
      b=$0
    }
  } else {
    if (NR % 9 > 3) {
      c=c" "$0
    } else {
      c=$0
    }
  }
}

Сохраните это в файл и запустите awk -f thatfile . Я уверен, что есть более разумные способы сделать это, но я не работаю с awk каждый день.

6
27.01.2020, 20:44

Это немного сложно. Я не знаю ни одной утилиты, которая могла бы это сделать:

Этот конвейер (по сути) читает 9 строк за раз и использует pr для форматирования в 3 столбца:

# there are 9 single hyphens below
paste -d: -- - - - - - - - - - < file | while read line; do
    tr : '\n' <<<"$line" | pr -s" " -T -3
done
a1 aa aaa
b1 bb bbb
c1 cc ccc
d1 dd ddd
e1 ee eee
f1 ff fff
g1 gg ggg
h1 hh hhh
i1 ii iii

Предполагается, что вы не используете В тексте нет двоеточия.

4
27.01.2020, 20:44

Один очень простой и понятный способ в TXR :

@(repeat)
@x0
@x1
@x2
@y0
@y1
@y2
@z0
@z1
@z2
@  (output)
@x0 @y0 @z0
@x1 @y1 @z1
@x2 @y2 @z2
@  (end)
@(end)

Выполнить:

$ txr reshape.txr data
a1 aa aaa
b1 bb bbb
c1 cc ccc
d1 dd ddd
e1 ee eee
f1 ff fff
g1 gg ggg
h1 hh hhh
i1 ii iii

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

@(repeat)
@  (collect :times 9)
@line
@  (end)
@  (bind (x y z) @(tuples 3 line))
@  (output)
@    (repeat)
@x @y @z
@    (end)
@  (end)
@(end)

Кроме того, вот как кто-то, кто хоть немного знает, что они делают в Awk, может реализовать:

        { a[(NR-1)%9] = $0 }
!(NR%9) { print a[0], a[3], a[6]
          print a[1], a[4], a[7]
          print a[2], a[5], a[8] }

Вывод:

$ awk -f reshape.awk data
a1 aa aaa
[ ... ]
i1 ii iii

И если этот кодировщик найдет повторяющиеся шаблоны print repugnant:

        { a[(NR-1)%9] = $0 }
!(NR%9) { for (i = 0; i < 3; i++)
            print a[i], a[i+3], a[i+6] }

Решение TXR Lisp:

[(opip (tuples 3) (tuples 3) (mappend transpose)
       (mapcar (aret `@1 @2 @3`)) tprint)
 (get-lines)]

Выполнить:

$ txr reshape.tl < data

В командной строке: использовать -t , отбросить tprint :

$ txr -t '[(opip (tuples 3) (tuples 3) (mappend transpose)
                 (mapcar (aret `@1 @2 @3`)))
           (get-lines)]' < data

Это работает путем ввода ввода через конвейер, который разбивает его на триплеты , а затем на триплеты этих триплетов (в основном матрицы 3x3, состоящие из вложенных списков). Эти матрицы индивидуально транспонируются, а их строки затем складываются вместе, чтобы получился один гигантский список триплетов.Эти триплеты превращаются в строки с помощью оператора частичного приложения aret , интерполяции строк, и выводятся с помощью tprint , который обрабатывает списки строк как строки для вывода. Синтаксис

(aret `@1 @2 @3`)

расширяется до чего-то похожего на

(lambda (. args)
  (apply (lambda (arg1 arg2 arg3)
           `@arg1 @arg2 @arg3`)
         args))

. По сути, он неявно создает анонимную функцию с одним аргументом, которая обрабатывает свой аргумент как список аргументов для применения к анонимной функции с тремя аргументами, где @ 1 , @ 2 и @ 3 обозначают аргументы. Тело функции получается из исходного квазистрочного выражения путем замены этих специальных числовых параметров на имена аргументов, сгенерированные машиной.

1
27.01.2020, 20:44

Теги

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