awk: вывести среднее значение для каждого учащегося вместе с указанными данными, используя разные разделители - PullRequest
0 голосов
/ 09 февраля 2019

Файл с именем Input.txt содержит следующие данные: имя, класс, schoolName, marks1 и marks2 с разделителем #:

Deepu#First#Meridian#95#90
Neethu#Second#Meridian#80#75
Sethu#First#DAV#75#70
Theekshana#Second#DAV#80#79
Teju#First#Sangamithra#88#63
Theekshita#Second#Sangamithra#91#90

Используя файл выше, напечатайте все детали вместе со средним, используя | разделитель в качестве вывода.

Мой ответ:

awk 'OFS="|" { avg=0; for(i=4;i<=NF;i++){avg=($4+$5)/2;} print $1,$2,$3,$4,$5,avg}' Input.txt

Я попробовал еще одну команду как:

awk 'OFS="|" {sum=0; for(i=4;i<=NF;i++) sum+=$i; print $1,$2,$3,$4,$5,sum/(NF-2)}' Input.txt

Вывод выглядит так: Output image

Пожалуйста, помогите мне получить желаемый результат.

Ответы [ 4 ]

0 голосов
/ 10 февраля 2019

Попробуйте этот более краткий способ:

awk -F# '{$(NF+1)=($4+$5)/2}1' OFS='|'

Например:

$ awk -F# '{$(NF+1)=($4+$5)/2}1' OFS='|' Input.txt
Deepu|First|Meridian|95|90|92.5
Neethu|Second|Meridian|80|75|77.5
Sethu|First|DAV|75|70|72.5
Theekshana|Second|DAV|80|79|79.5
Teju|First|Sangamithra|88|63|75.5
Theekshita|Second|Sangamithra|91|90|90.5
0 голосов
/ 10 февраля 2019

Вы должны установить FS в НАЧАЛЕ, ниже у меня работает

awk 'BEGIN {FS="#"} {avg=0; for(i=0;i<NR;i++) avg=($4 + $5)/2.0;}{OFS="|"}{print $1,$2,$3,$4,$5,avg}'

$ awk 'BEGIN {FS="#"} {avg=0; for(i=0;i<NR;i++) avg=($4 + $5)/2.0;}{OFS="|"}{print $1,$2,$3,$4,$5,avg}' mehdi.txt
Deepu|First|Meridian|95|90|92.5
Neethu|Second|Meridian|80|75|77.5
Sethu|First|DAV|75|70|72.5
Theekshana|Second|DAV|80|79|79.5
Teju|First|Sangamithra|88|63|75.5
Theekshita|Second|Sangamithra|91|90|90.5

$

Спасибо @EdMorton.Это может быть сокращено как

$ awk ' BEGIN { FS="#";OFS="|"} {$6=($4 + $5)/2.0;$0=$0;print $0 }' mehdi.txt
Deepu|First|Meridian|95|90|92.5
Neethu|Second|Meridian|80|75|77.5
Sethu|First|DAV|75|70|72.5
Theekshana|Second|DAV|80|79|79.5
Teju|First|Sangamithra|88|63|75.5
Theekshita|Second|Sangamithra|91|90|90.5

$
0 голосов
/ 10 февраля 2019
awk -F#  'OFS="|" {avg=($4+$5/2);gsub(/#/,"|");print $0,avg}' Input.txt

Это будет сделано без необходимости перебирать первую часть строки.Это делает замену "#" на "|"на всю строку, а затем просто печатает среднее значение после перепечатки строки с требуемым форматом и разделителем вывода.

0 голосов
/ 10 февраля 2019

После использования FS в команде:

awk 'FS="#" {avg=0; for(i=0;i<NR;i++) avg=($4 + $5)/2;}{OFS="|"}{print $1,$2,$3,$4,$5,avg}' Input.txt

Я получаю желаемый вывод, но в выводе среднее значение первой строки отображается как ноль, и OFS здесь также не применяется.Кто-нибудь может рассказать мне об этом?

Вывод выглядит так: Вывод изображения

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