Я не стал вводить букву «c» в параметре -c
как букву, отличную от ASCII. Вот в чем проблема. Я исправил это, и проблема исчезла.
Убедитесь, что вы набираете команды bash и их параметры в ASCII.
Решение с awk
:
awk 'FNR==NR{c[$4]++;next;} c[$4]==3' file.dat file.dat
Вывод:
chr1 3000823 3000829 1
chr1 3001003 3001009 1
chr1 3001014 3001020 1
chr1 3007426 3007432 10
chr1 3007528 3007534 10
chr1 3007576 3007582 10
Пояснение:
FNR == NR
: Этот тест верен, когда количество записей равно количеству записей в файле. Это верно только для первого файла, для второго файла NR
будет равно количеству строк в файле1 + FNR. c [$ 4] ++
: увеличить индекс элемента массива на $ 4
. Я использую это как счетчик. next
: переход к следующей записи, ничего не делая. c [$ 4] == 3
: это происходит только с записями второго файла. Если этот тест прошел успешно, строка будет напечатана, поскольку печать является действием по умолчанию в awk
. Недостаток этого кода заключается в том, что он дважды читает файл, но, на мой взгляд, это чистый и простой для понимания способ выполнить эту работу.
{
i = int(count[$4])
arr[$4,i] = $0
count[$4]++
}
END {
for (i in count) {
if (count[i]== n) {
for (j=0; j<n; j++) {
printf("%s\n", arr[i,j])
}
}
}
}
sample run --
awk -v n=3 -f 1.awk 1.dat
chr1 3007426 3007432 10
chr1 3007528 3007534 10
chr1 3007576 3007582 10
chr1 3000823 3000829 1
chr1 3001003 3001009 1
chr1 3001014 3001020 1
awk -v n=8 -f 1.awk 1.dat
chr1 3003222 3003228 4
chr1 3003335 3003341 4
chr1 3003375 3003381 4
chr1 3003578 3003584 4
chr1 3003636 3003642 4
chr1 3003717 3003723 4
chr1 3003881 3003887 4