Самая длинная общая подстрока с помощью grep

unlink(1) намеренно упрощенный вариант rm(1).

Я не уверен, почему это было создано, но это, вероятно вследствие того, что под капотом, rm(1) реализован с точки зрения unlink(2) системный вызов. Поэтому я принимаю причину unlink(1) должен предоставить более прямой путь системному вызову. Кто-то, несомненно, придумал вариант использования где rm(1) сделал неправильную вещь и решил, что лучший способ зафиксировать ее состоял в том, чтобы обеспечить этот прямой путь.

3
03.04.2012, 02:18
3 ответа

Это попыталось бы соответствовать с начала:

t=TMP_ABC_SEQ_NUM
for n in $(seq 0 ${#t})
do
  grep ${t:n} dictionary.txt && break
done

Это ищет самую длинную последовательность, неважно, где она запускается:

for len in $(seq ${#t} -1 3)
do
   for start in $(seq 0 $((${#t}-len)))
   do
       grep ${t:start:len} dictionary.txt && break 2
   done
done 

требование: подобная удару оболочка, доступная здесь: собственные win32 порты многих GNU-utils, как sh.exe, grep, sed, awk, до н.э, кошка, tac, версия, седло, сокращение...

3
27.01.2020, 21:17

Возможный подход, для сокращения строки от главы, пока это не соответствует:

#!/bin/sh
string="TMP_ABQ_SEQ_NUM"
while ! grep "$string" dictionary.txt; do 
  # remove the shortest leading string ending with "_"
  string="${string#*_}"
done
2
27.01.2020, 21:17
  • 1
    Это работало бы в соответствии с Windows? Я использую grep в соответствии с Windows. –  CodeBlue 02.04.2012, 17:29
  • 2
    @CodeBlue: это не делает зависит от grep, но на доступности оболочки POSIX. Это, конечно, доступно через Cygwin. –  enzotib 02.04.2012, 17:30
  • 3
    Что, если строка была FOO_ABQ_SEQ_NUM_BAR? –  Gilles 'SO- stop being evil' 03.04.2012, 02:18
  • 4
    @Gilles: проблема, кажется, не четко определена, таким образом, мой был только предварительным решением –  enzotib 03.04.2012, 08:45

Вы могли инвертировать способ, которым Вы смотрите на это? Вместо поиска TMP_ABQ_SEQ_NUM в dictionary.txt, разве Вы не могли искать первое поле для каждой строки в dictionary.txt (ABQ_SEQ_NUM) в исходном файле?

Если это верно, следующее должно работать

#!/bin/bash
for i in $(awk '{print $1}' dictionary.txt) do
    grep $i $1
done

Передайте вышеупомянутый сценарий название файла, который Вы хотите проверить на последовательности, существующие в dictionary.txt. Извинения, если это не то, что Вы хотели.

0
27.01.2020, 21:17

Теги

Похожие вопросы