2016-05-11 2 views
0

Мой входной файл AWK следующим образом:Sum один столбец на основе шаблона в другой

scaffold100 115050 116050 1000 115050 124008 2 
scaffold100 1167811 1168811 1000 1167811 1568661 0 
scaffold100 151385 152385 1000 151385 193501 4 
scaffold100 1585695 1586695 2000 1585695 1644609 5 
scaffold100 1654143 1655143 2000 1654143 1673659 3 
scaffold100 1711976 1712976 2000 1711976 1843374 1 

Я учусь AWK, и я хочу использовать его, чтобы подвести столбец 7 основан на колонке 4. То есть если столбец 4 равен 1000, затем суммируйте 2 + 0 + 4 = 6 и распечатайте.

Я Tyring этот код, но я не понимаю, что я делаю неправильно:

awk '{if($4==1000) {sum+=$7;n++}END{print sum}}' file 
+0

Читать книгу Эффективное Awk программирование, 4-е издание, Арнольд Роббинс. Начните с этого, и тогда вы не будете путаны в синтаксисе awk и напишите сценарии, как вы опубликовали. –

ответ

2

Вы можете использовать этот awk:

awk '$4==1000{sum+=$7}END{print sum+0}' file 

Выход:

$ awk '$4==1000{sum+=$7}END{print sum+0}' a 
6 

Другой awk:

awk '{arr[$4]+=$7}END{for(val in arr){print val,arr[val]}}' file 

Выход:

$ awk '{arr[$4]+=$7}END{for (val in arr) {print val,arr[val]}}' a 
2000 9 
1000 6 
1

Ваше открытие и закрытие фигурные скобки являются немного перепутались.

$ cat data 
scaffold100 115050 116050 1000 115050 124008 2 
scaffold100 1167811 1168811 1000 1167811 1568661 0 
scaffold100 151385 152385 1000 151385 193501 4 
scaffold100 1585695 1586695 2000 1585695 1644609 5 
scaffold100 1654143 1655143 2000 1654143 1673659 3 
scaffold100 1711976 1712976 2000 1711976 1843374 1 
$ awk 'BEGIN{sum=0}{if($4==1000) {sum+=$7}}END{print sum}' data 
6 

или

$awk '$4==1000 {sum+=$7} END{print sum}' data 
6 
Смежные вопросы