Используйте printf для форматирования списка, который является неравномерным - PullRequest
0 голосов
/ 11 октября 2019

У меня есть небольшой список оценок учеников, мне нужно отформатировать их рядом в зависимости от пола ученика. Итак, один столбец - мужской, другой - женский. Проблема в том, что список не идет мужчина женский мужчина женский, он неравномерный.

Я пытался использовать printf для форматирования вывода, чтобы 2 столбца располагались рядом, но формат разрушен из-занеровный список.

Name Gender Mark1 Mark2 Mark3
AA M 20 15 35
BB F 22 17 44
CC F 19 14 25
DD M 15 20 42
EE F 18 22 30
FF M 0 20 45

Это список, о котором я говорю ^^

awk 'BEGIN {print "Male" " Female"} {if (NR!=1) {if ($2 == "M") {printf "%-s %-s %-s", $3, $4, $5} else if ($2 == "F") {printf "%s %s %s\n", $3, $4 ,$5}}}' text.txt

Так что я получаю результаты типа

Male Female
20 15 35 22 17 44
19 14 25
15 20 42 18 22 30 
0 20 45

Но яхочу это так:

Male Female
20 15 35 22 17 44
15 20 42 19 14 25
0 20 45 18 22 30

Я еще не добавил разделители, я просто пытаюсь это выяснить, не уверен, что было бы лучше поместить метки в 2 массива в зависимости от пола, чем печататьих.

Ответы [ 4 ]

1 голос
/ 12 октября 2019

другое решение пытается обратиться, если M / F не единица

$ awk 'NR==1 {print "Male\tFemale"} 
       NR>1  {k=$2;$1=$2="";sub(/ +/,"");
              if(k=="M") m[++mc]=$0; else f[++fc]=$0} 
       END   {max=mc>fc?mc:fc; 
              for(i=1;i<=max;i++) print (m[i]?m[i]:"-") "\t" (f[i]?f[i]:"-")}' file |
  column -ts$'\t'

Male      Female
20 15 35  22 17 44
15 20 42  19 14 25
0 20 45   18 22 30
0 голосов
/ 12 октября 2019

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

sed -Ee '1c\Male Female' -e 'N;s/^.. M (.*)\n.. F(.*)/\1\2/;s/^.. F(.*)\n.. M (.*)/\2\1/' file

Изменить строку заголовка. Затем сравните пару строк и переставьте их соответствующим образом.

0 голосов
/ 12 октября 2019

Другой подход с использованием awk

awk '
        BEGIN {
                print "Male\t\tFemale"
        }
        NR > 1 {
                I = ++G[$2]
                A[$2 FS I] = sprintf("%2d %2d %2d", $(NF-2), $(NF-1), $NF)
        }
        END {
                M = ( G["M"] > G["F"] ? G["M"] : G["F"] )
                for ( i = 1; i <= M; i++ )
                        print A["M" FS i] ? A["M" FS i] : OFS, A["F" FS i] ? A["F" FS i] : OFS
        }
' OFS='\t' file
0 голосов
/ 12 октября 2019

Как то так?

awk 'BEGIN{format="%2s %2s %2s %2s\n";printf("Male     Female\n"); }NR>1{if (s) { if ($2=="F") {printf(format, s, $3, $4, $5);} else {printf(format, $3,$4,$5,s);} s=""} else {s=sprintf("%2s %2s %2s", $3, $4, $5)}}' file
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...