2015-05-02 3 views

ответ

2

Рассмотрим эту матрицу образца :

$ cat matrix 
1 2 3 
4 5 6 
7 8 9 

Для печати верхнего правого треугольника:

$ awk '{for (i=1;i<=NF;i++) printf "%s%s",(i>=NR)?$i:" ",FS; print""}' matrix 
1 2 3 
    5 6 
    9 

Или:

$ awk '{for (i=1;i<=NF;i++) printf "%2s",(i>=NR)?$i:" "; print""}' matrix 
1 2 3 
    5 6 
    9 

Для печати левый верхний треугольник:

$ awk '{for (i=1;i<=NF+1-NR;i++) printf "%s%s",$i,FS; print""}' matrix 
1 2 3 
4 5 
7 

Или:

$ awk '{for (i=1;i<=NF+1-NR;i++) printf "%2s",$i; print""}' matrix 
1 2 3 
4 5 
7 
+1

Почему бы не использовать трехкомпонентной для второго '% с 'тоже:' {for (i = 1; i <= NF; i ++) printf "% s% s", (i

1

Это может работать для вас (GNU SED):

sed -r ':a;n;H;G;s/\n//;:b;s/^\S+\s*(.*)\n.*/\1/;tb;$!ba' file 

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

N.B. Счетчик устанавливается после печати текущей строки, иначе первая строка будет минус первое поле.

Поразмыслив альтернатива/более элегантное решение:

sed -r '1!G;h;:a;s/^\S+\s*(.*)\n.*/\1/;ta' file 

И напечатать левый верхний треугольник:

sed -r '1!G;h;:a;s/^([^\n]*)\S+[^\n]*(.*)\n.*/\1\2/;ta' file 
0
$ awk '{for (i=NR;i<=NF;i++) printf "%s%s",$i,(i<NF?FS:RS)}' file 
1 2 3 
5 6 
9 
Смежные вопросы