2013-05-24 3 views
4

У меня есть текстовый файл с 10 столбцами говорят f.txt, который выглядит, как показано ниже:подсчета количества строк из текстовых файлов

aab abb 263-455 
aab abb 263-455 
aab abb 263-455 
bbb abb 26-455 
bbb abb 26-455 
bbb aka 264-266 
bga bga 230-232 
bga bga 230-232 

Я хочу, чтобы подсчитать уникальный номер каждой строки в первой и второй столбцов на основе номеров третьего столбца.

Выход:

aab - 1 
abb - 2 
bbb - 2 
aka - 1 
bga - 2 

Total no - 8 
+0

Если не рассчитывать на 'bga' быть 1? –

+1

Итак, в чем вопрос? Вы хотите, чтобы кто-то реализовал его для вас? И я не понимаю, для чего используются цифры в третьем столбце. И вы говорите, что в файле 10 столбцов? – Vince

+0

@sudo Это должно быть 2. Число bga в первом столбце - одно. Во втором столбце также одно число. поэтому общая сумма равна двум. – user2416563

ответ

3
awk ' 
     !s[1":"$1":"$3]++{sU[$1]++;tot++} 
     !s[2":"$2":"$3]++{sU[$2]++;tot++} 
     END{ 
     for (x in sU) print x, sU[x]; 
     print "Total No -",tot; 
     }' input 

Выход

bga 1 
aab 1 
bbb 2 
aka 1 
bga 1 
abb 2 
Total No - 8 
+1

Вы считаете 'bga' дважды отдельно? –

+0

@sudo_O, да. OP хочет видеть их как разные элементы, если в разных столбцах. Я показывал их отдельно, но затем сливался в одну запись. – perreal

3

Это будет делать трюк:

$ awk '!a[$0]++{c[$1]++;c[$2]++} 
     END{for(k in c){print k" - "c[k];s+=c[k]}print "\nTotal No -",s}' file 
aka - 1 
bga - 2 
aab - 1 
abb - 2 
bbb - 2 

Total No - 8 

В более читаемом виде сценария:

!lines[$0]++{ 
    count[$1]++ 
    count[$2]++ 
} 
END { 
    for (line in count) { 
     print line" - "count[line] 
     sum += count[line] 
    } 
    print "\nTotal No -",sum 
} 

Чтобы запустить его в таком виде сохранить его в файл script.awk и:

$ awk -f script.awk file 
aka - 1 
bga - 2 
aab - 1 
abb - 2 
bbb - 2 

Total No - 8 
+1

+1 красиво сделано! –

1

Это длинная команда немного, но это легко понять:

gawk '{a[$3,$1,1];a[$3,$2,2]}END{for(i in a)print i}' input | 
    cut -d $'\x1c' -f 2 | sort | uniq -c | 
     awk -v OFS=' - ' '{sum+=$1;print $2,$1};END{print "\nTotal No",sum}' 

aab - 1 
abb - 2 
aka - 1 
bbb - 2 
bga - 2 

Total No - 8 
+0

Предлагая 'gawk '[$ 3, $ 1,1]; [$ 3, $ 2,2]; END {для (i in a) print i}'' может быть очень вводящим в заблуждение как 'a [$ 3, $ 1,1] 'и' a [$ 3, $ 2,2] 'являются условными без блоков, поэтому, если оценивается true, будет выполняться блок по умолчанию' {print $ 0} ', но, поскольку никакие значения не назначены ни одному из массивов, они по умолчанию равны false. Лучше быть явным и использовать 'gawk '{a [$ 3, $ 1,1]; [$ 3, $ 2,2]} END {для (i в a) print i}'' (добавляет только один символ) -vOFS' не переносится по всем awks, бросает пространство для безопасности '-v OFS' или явно использует' gawk', как ваш первый скрипт. –

+0

@sudo_O Спасибо. – kev

0
{ if (a[$1][$3] != 1){ 
    a[$1][$3] = 1; 
    total[$1]++; 
    } 
if (a[$2][$3] != 1){ 
    a[$2][$3] = 1; 
    total[$2]++; 
    } 
} 
END { 
    for (item in total){ 
     print item, total[item]; 
     totalCount += total[item]; 
    } 
    print "\nTotal no - ", totalCount; 
} 

Выход:

aka 1 
bga 1 
aab 1 
abb 2 
bbb 2 

Total no - 7 
2
awk '!b[$1,$3]++{a[$1]++} !c[$2,$3]++{a[$2]++} END{for (i in a) {print i,a[i];sum+=a[i]}print "Total -",sum}' file 
Смежные вопросы