Другой инструмент, который может сделать это, — tsv-pretty
из eBay's TSV Utilities(отказ от ответственности :Я автор ). Это требует дополнительного шага выравнивания числовых полей по десятичной точке. Например:
$ tsv-pretty foo
case elems meshing nlsys
uniform 2350 0.076662 2.78
non-conformal 348 0.013332 0.55
scale 318 0.013333 0.44
smarter 504 0.016666 0.64
submodel 360 .009999 0.40
unstruct-quad 640 0.019999 0.80
unstruct-tri 1484 0.01 0.88
Существует несколько вариантов форматирования. Например, -u
подчеркивает заголовок, а -f
аналогично форматирует числа с плавающей запятой в поле для удобочитаемости:
$ tsv-pretty foo -f -u
case elems meshing nlsys
---- ----- ------- -----
uniform 2350 0.076662 2.78
non-conformal 348 0.013332 0.55
scale 318 0.013333 0.44
smarter 504 0.016666 0.64
submodel 360 0.009999 0.40
unstruct-quad 640 0.019999 0.80
unstruct-tri 1484 0.010000 0.88
Дополнительную информацию можно найти в tsv -красивой ссылке .
Это может сработать:
sort -u patterns.txt > sorted_patterns.txt # only once
diff -sq <(grep -o -f sorted_patterns.txt file.txt | sort -u) sorted_patterns.txt
Если у вас фиксированные строки вместо шаблонов, используйте -F
. Это делает grep
намного быстрее!
Вы также можете использоватьcmp
вместо diff -s
. Это может быть немного быстрее, но не сможет показать, чего не хватает.
Вывод, если найдены не все шаблоны:
Files /dev/fd/63 and /dev/fd/62 differ
или если все закономерности найдены:
Files /dev/fd/63 and /dev/fd/62 are identical
Опустите -q
, чтобы узнать , чего не хватает.
2a3
> missing_word
cat file.txt | awk '
NR == FNR {seen[$0] = 0; next}
{for (p in seen) if ($0 ~ p) seen[p]++}
END {
for (p in seen)
if (seen[p] == 0) {
missing++
print "missing pattern", p
}
if (missing == 0) print "all found"
exit missing
}
' patterns.txt -
Замените команду cat
любым конвейером, создающим текст.
с grep
и расширением PCRE, а также с использованием мощности команды printf
; вы бы сделали что-то вроде:
<infile grep -qzP "(?s)$(printf "(?=.*?%s)" $(<pattern.txt))" &&
echo 'all matched' ||
echo 'one or more pattern(s) does not found'
если все шаблоны (в в любом порядке)найдены во входном файле в файле то текстall matched
будет отправлен на вывод; в противном случае текстone or more pattern(s) does not found
будет отображаться эхом.
это будет действовать шаблон как совпадающий шаблон, например pat[01]
будет соответствовать обоим pat0
и pat1
; чтобы соответствовать точному шаблону, скажем, pat[01]
буквально измените модификатор управления printf
с %s
на %q
, который будет экранировать специальные символы.
<infile grep -qzP "(?s)$(printf "(?=.*?%q)" $(<pattern.txt))" &&
echo 'all matched' ||
echo 'one or more pattern(s) does not found'