Bash Разделить выходные группы на столбцы

Нет, это невозможно из-за особенностей работы tmate (и подобных программ, таких как GNU Screen ).

Весь tmate ввод-вывод проходит через псевдо -tty, или "pty". У этого есть две стороны, которые я буду называть стороной пользователя и стороной процесса. *Сторона процесса имеет три потока данных (последовательности байтов ):она отправляет данные в stdinпроцесса и считывает данные из stdoutи stderrпроцесса. *Пользовательская сторона имеет два потока данных, :она считывает ввод от пользователя (, например. то, что он набирает ), которое затем отправляется в поток stdinна стороне процесса и записывает данные пользователю, которые представляют собой смесь всего, что читается со стороны процесса stdoutи stderr.

Что делает tmate, так это добавляет дополнительный уровень перед pty, который берет все байты, выводимые с пользовательской стороны pty, и отправляет копию каждого байта каждому клиенту tmate, считывает все входные данные со всех клиентов и отправляет это, смешанный, к pty.

Из этого вы можете видеть, что на стороне процесса pty процесс, читающий со стандартного ввода (bash, vimили чего-то еще ), не может узнать, какой клиент отправил какой-либо конкретный байт, или даже что там несколько клиентов (или вообще какие-либо клиенты ). Таким образом, процесс, который генерирует "курсор" для этого сеанса, не может иметь несколько курсоров.

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

0
23.01.2021, 09:41
3 ответа

начните с;

| perl -pe 's/\n/,/g' \
| perl -pe 's/,(id:)/\n$1/g' \
| csvtool transpose - \
| column -t -s,

Затем разбить на 2 столбика петлей (и опциональной обрезкой );

TC=""
while read L ; do
    if [ "$TC" == "" ] ; then
            TC="$L"
    else
            echo -e "$TC\n$L" \
            | csvtool transpose - \
            | column -t -s,
            echo
            TC=""
    fi
done < <(cat test.txt \
| perl -pe 's/^(.{24}).*/$1.../g;
s/\n/,/g' \
| perl -pe 's/,(id:)|$/\n$1/g')
echo "$TC" \
| csvtool transpose -
0
18.03.2021, 22:35

Лошадь убежала, но если количество строк в записи фиксировано и составляет 14 плюс пустая разделительная строка, то нужно ли это делать сложнее, чем найти среднюю точку?

l=$(cat file | wc -l); s=$(( (l / 30)*15+14 )); t=$(( l-s-1 )); 
  paste <(head -n $s file) <(tail -n $t file)
0
18.03.2021, 22:35

Я добавил 3-й блок в ваш пример ввода, чтобы показать, что он может обрабатывать нечетное количество блоков без повторения или пропуска одного, и я сделал каждую строку шириной не более 20 символов и уменьшил количество строк в блоке (см. нижнюю часть этого ответа ), чтобы мы могли легко увидеть, как выходные данные разделяются на ряды столбцов:

$ cat tst.awk
BEGIN {
    RS = ""
    FS = "\n"
    OFS = "\t"
    maxCols = (maxCols ? maxCols : 2)
}
{
    numRows = NF
    numCols++
    for (rowNr=1; rowNr<=numRows; rowNr++) {
        vals[rowNr,numCols] = $rowNr
    }
}
(NR%maxCols) == 0 { prt() }
END { prt() }

function prt(   rowNr,colNr) {
    if ( numCols != 0 ) {
        for ( rowNr=1; rowNr<=numRows; rowNr++) {
            for (colNr=1; colNr<=numCols; colNr++) {
                printf "%s%s", vals[rowNr,colNr], (colNr<numCols ? OFS : ORS)
            }
        }
        print ""
        numCols = 0
    }
}

$ awk -f tst.awk file | column -s$'\t' -tL
id: c2b751c227111edf  id: be7e8ec30c8fff9d
blob_size: 1965       blob_size: 1968
weight: 1965          weight: 1968
fee: 0.000015690000   fee: 0.000015710000
fee/byte: 0.00000000  fee/byte: 0.00000000

id: blahblahblahblah
blob_size: 1968
weight: 1968
fee: 0.000015710000
fee/byte: 0.00000000

Если вы хотите, чтобы количество блоков (столбцов )в каждой строке вывода отличалось от 2, просто установите maxColsна то количество блоков, которое вы хотите вывести в строке:

$ awk -v maxCols=3 -f tst.awk file | column -s$'\t' -tL
id: c2b751c227111edf  id: be7e8ec30c8fff9d  id: blahblahblahblah
blob_size: 1965       blob_size: 1968       blob_size: 1968
weight: 1965          weight: 1968          weight: 1968
fee: 0.000015690000   fee: 0.000015710000   fee: 0.000015710000
fee/byte: 0.00000000  fee/byte: 0.00000000  fee/byte: 0.00000000

Описанное выше было выполнено для этого входного файла.:

$ cat file
id: c2b751c227111edf
blob_size: 1965
weight: 1965
fee: 0.000015690000
fee/byte: 0.00000000

id: be7e8ec30c8fff9d
blob_size: 1968
weight: 1968
fee: 0.000015710000
fee/byte: 0.00000000

id: blahblahblahblah
blob_size: 1968
weight: 1968
fee: 0.000015710000
fee/byte: 0.00000000
1
18.03.2021, 22:35

Теги

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