считать, групповой с седом или awk - PullRequest
0 голосов
/ 07 января 2019

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

Пример данных:

687/878 9
890987  4
01a 55
1b  8743917
890a    34
abcdee  987
dfeqfe  fkdjald
890897  34213
6878853 834
32fasd  53891
abcdee  8794371
abd 873

результат:

687 2
890 3
01a 1
1b  1
32fasd  1
abd 1
dfeqfe  1
abcdee  2

Я также был бы признателен за решение, которое

также учитывает пример ввода, такой как

687/878 9
890987  4
01a     55
1b      8743917
890a    34
abcdee  987
dfeqfe  545
890897  34213
6878853 834
(632)fasd  53891
(88)abcdee  8794371
abd     873

поэтому первый столбец может иметь значения, такие как (,), #, ', всевозможные символы

поэтому в выводе будут два столбца: первый с извлеченными значениями, а второй с новым счетчиком, с новыми значениями, извлеченными из исходного файла.

Опять предпочтительный формат вывода цв.

, поэтому мне нужно извлечь все значения, которые начинаются с ^ \ d \ d \ d, а затем для этих трех первых цифр сортируйте и подсчитывайте уникальные значения,

но во втором проходе также сделайте то же самое для каждой строки, которая не начинается с 3 цифр, но на этот раз сохраните значение целого столбца и подсчитайте его по нему.

что я пробовал: | sort | uniq -c | sort -nr для строк, начинающихся с ^ \ d \ d \ d, и

то же самое для тех, кто не выполняет вышеприведенное регулярное выражение, но есть ли более элегантный способ с использованием sed или awk?

Ответы [ 2 ]

0 голосов
/ 07 января 2019
$ cat tst.awk
BEGIN { FS=OFS="\t" }
{ cnt[/^[0-9]{3}/ ? substr($1,1,3) : $1]++ }
END {
    for (key in cnt) {
        print (key !~ /^[0-9]{3}/), cnt[key], key, cnt[key]
    }
}

$ awk -f tst.awk file | sort -k1,2n | cut -f3-
687     1
890     2
abcdee  1
0 голосов
/ 07 января 2019

Вы можете попробовать Perl

$ cat nefijaka.txt
687     878     9
890987  4
890a    34
abcdee  987
$ perl -lne  ' /^(\d{3})|(\S+)/; $x=$1?$1:$2; $kv{$x}++; END { print "$_\t$kv{$_}" for (sort keys %kv) } ' nefijaka.txt
687     1
890     2
abcdee  1
$

Вы можете отсортировать и получить отсортированные значения.

$ perl -lne  ' /^(\d{3})|(\S+)/; $x=$1?$1:$2; $kv{$x}++; END { print "$_\t$kv{$_}" for (sort keys %kv) } ' nefijaka.txt | sort -k2 -nr
890     2
abcdee  1
687     1

EDIT1:

$ cat nefijaka.txt2
687     878     9
890987  4
890a    34
abcdee  987
a word and then 23
$ perl -lne  ' /^(\d{3})|(.+?\t)/; $x=$1?$1:$2; $x=~s/\t//g; $kv{$x}++; END { print "$_\t$kv{$_}" for (sort keys %kv) } ' nefijaka.txt2
687     1
890     2
a word and then 1
abcdee  1
$
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...