$ cat tst.awk
BEGIN { FS="" }
{
for (i=1;i<=NF;i++) {
a[NR,i]=$i
}
numCols = (NF>numCols?NF:numCols)
numRows = NR
}
END {
rowNr=1
for (colNr=1;colNr<=numCols;colNr++) {
for (;rowNr<=numRows;rowNr++) {
printf "%*s", colNr-1, ""
for (delta=0;delta<rowNr;delta++) {
printf "%s%s", a[rowNr-delta,colNr+delta], (delta<(rowNr-1)?FS:RS)
}
}
rowNr=numRows
}
}
.
$ awk -f tst.awk file1
a
eb
ifc
jgd
kh
l
$
$ awk -f tst.awk file2
a
fb
kgc
lhd
mie
nj
o
$
$ awk -f tst.awk file3
a
db
hec
if
g
Ответьте на комментарии ниже от @JoseRicardoBustosM. предполагая, что выше не дает желаемых результатов от одного из его образцов входов, вот предложил input4
:
$ cat input4
Jose
y
Ricardo
y
Gloriset
и выше скрипт запустить на нем:
$ awk -f tst.awk input4
J
yo
Rs
yie
Gc
la
or
rd
io
s
e
t
и вот модифицированный скрипт вводить пустые символы, если не существует IF, что было желательным поведением, которое, я думаю, крайне маловероятно:
$ cat tst2.awk
BEGIN { FS="" }
{
for (i=1;i<=NF;i++) {
a[NR,i]=$i
}
numCols = (NF>numCols?NF:numCols)
numRows = NR
}
END {
rowNr=1
for (colNr=1;colNr<=numCols;colNr++) {
for (;rowNr<=numRows;rowNr++) {
printf "%*s", colNr-1, ""
for (delta=0;delta<rowNr;delta++) {
printf "%s%s", ((rowNr-delta,colNr+delta) in a ? a[rowNr-delta,colNr+delta] : " "), (delta<(rowNr-1)?FS:RS)
}
}
rowNr=numRows
}
}
$ awk -f tst2.awk input4
J
yo
R s
yi e
G c
l a
o r
r d
i o
s
e
t
Пожалуйста, взгляните на [Как создать минимальное, полное и Verifiab пример] (http://stackoverflow.com/help/mcve). Покажите пример ввода и ваш желаемый результат для ввода этого образца. – Cyrus
Пожалуйста, вы должны добавить примеры: 3words x 5letters, 3words x каждое слово с разной длиной, если это возможно ?, и т. Д. –