Как разбить массив Bash на несколько столбцов в таблице уценок? - PullRequest
0 голосов
/ 16 июня 2019

Я пытаюсь разделить массив Bash на несколько столбцов, чтобы отобразить их в виде таблицы в файле Markdown.

Я искал быстрый однострочный текст, чтобы сделать это, используя Bash, AWK и другие языки. Я знаю о команде column, но не могу сохранить вывод в переменную или файл (stdout). Я знаю, что вы можете зациклить массив, извлекая значения в отдельные фрагменты, но должен быть более быстрый и эффективный способ.

  • keywords.md
awk
accessibility
bash
behat
c++
cache
d3.js
dates
engineering
elasticsearch
...
  • columns.sh
local data="$(sort "keywords.md")"     # read contents of file
local data=($data)                     # split contents into an array
local table="||||||\n"                 # create markdown table header
table="${table}|---|---|---|---|---|"
local numColumns=5
# split data into five columns and append to $table variable

Я пытаюсь получить этот результат.

||||||
|---|---|---|---|---|
|awk|bash|c++|d3.js|engineering
|accessibility|behat|cache|dates|elasticsearch

результат команды столбца

Ответы [ 2 ]

0 голосов
/ 16 июня 2019

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

#!/usr/bin/perl
use warnings;
use strict;
use feature qw/say/;

my $ncolumns = 5;

# Read the list of values.
my @data;
while (<>) {
  chomp;
  push @data, $_;
}

# Partition the data up into rows, added down by column
my @columns;
my $nrows = @data / $ncolumns;
#@data = sort { $a cmp $b } @data;
while (@data) {
  my @c = splice @data, 0, $nrows;
  for my $n (0 .. $#c) {
    push @{$columns[$n]}, $c[$n];
  }
}

# And print them out
say '|' x $ncolumns;
say '|', join('|', ('---') x $ncolumns), '|';
for my $r (0 .. $nrows - 1) {
  my @row;
  for my $c (0 .. $ncolumns - 1) {
    my $item = $columns[$r]->[$c];
    push @row, $item if defined $item;
  }
  push @row, ('')x$ncolumns;
  say '|', join('|', @row[0 .. $ncolumns - 1]);
}

Использование:

$ ./table.pl keywords.md
|||||
|---|---|---|---|---|
|awk|bash|c++|d3.js|engineering
|accessibility|behat|cache|dates|elasticsearch
0 голосов
/ 16 июня 2019

Вот общий подход:

$ cat tst.awk
BEGIN {
    numCols = (numCols ? numCols : 5)
    OFS = "|"
}
{
    colNr = (NR - 1) % numCols + 1
    if ( colNr == 1 ) {
        numRows++
    }
    vals[numRows,colNr] = $0
}
END {
    hdr2 = OFS
    for (colNr=1; colNr<=numCols; colNr++) {
        hdr2 = hdr2 "---" OFS
    }
    hdr1 = hdr2
    gsub(/-/,"",hdr1)
    print hdr1 ORS hdr2

    for (rowNr=1; rowNr<=numRows; rowNr++) {
        printf "|"
        for (colNr=1; colNr<=numCols; colNr++) {
            val = vals[rowNr,colNr]
            printf "%s%s", val, (colNr<numCols ? OFS : ORS)
        }
    }
}

.

$ awk -f tst.awk file
||||||
|---|---|---|---|---|
|awk|accessibility|bash|behat|c++
|cache|d3.js|dates|engineering|elasticsearch

но, очевидно, он не выводит столбцы в порядке, который вы задали в своем вопросе, так как я не понимаю, как вы пришли к этому заказу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...