2015-10-10 4 views
0

Входной файлКак обрабатывать пробелы в оболочке?

 name;x1;x2 
    jon,doe;10;20 
    sam,smith;11;21 

Это то, что я пытался до сих пор

awk 'BEGIN {print "name\tx1\tx2\tAvg"} {s+=$2} {k+=$3} {print $1,"\t",$2,"\t",$3,"\t",($2+$3)/2} END {print s/2,k/2}' input.txt 

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

Ожидаемый результат должен быть:

name;x1;x2 Average 
jon,doe;10;20 15 
sam,smith;11;21 16 
Average 10.5 20.5 
+0

Каков ожидаемый результат для этого файла? –

+0

@ReutSharabani ожидаемый результат должен быть средним для строк и столбцов. –

+0

@ReutSharabani Почему это проголосовали? –

ответ

2

Сепаратор поле ввода по умолчанию для AWK является пробел. Это не работает для вашего файла, где разделитель полей является точкой с запятой. Чтобы исправить это, используйте опцию -F\;. С некоторыми другими незначительными изменениями, попробуйте:

$ awk -F';' '{sub(/^ +/,"");} NR==1 {print $0, "Avg";next} {s+=$2} {k+=$3} {print $0,($2+$3)/2} END {print "Ave",s/(NR-1),k/(NR-1)}' OFS='\t' input.txt 
name;x1;x2  Avg 
jon,doe;10;20 15 
sam,smith;11;21 16 
Ave  10.5 20.5 

Выход пробы в вопросе и, как и выше имеет сочетание запятой и пробел для разделения полей. Если вы хотите последовательно использовать точки с запятой:

$ awk -F';' '{sub(/^ +/,"");} NR==1 {print $0, "Avg";next} {s+=$2} {k+=$3} {print $0,($2+$3)/2} END {print "Ave",s/(NR-1),k/(NR-1)}' OFS=';' input.txt 
name;x1;x2;Avg 
jon,doe;10;20;15 
sam,smith;11;21;16 
Ave;10.5;20.5 
+0

да, это то, что я искал. Я скорректировал таблицу выше, как вы упомянули. (11 + 21)/2 –

+0

@jon Рад, что это сработало. – John1024