使用诸如grep之类的bash工具来解决难题



我需要使用shell脚本来解决一个难题。我尝试将greprev组合,并将输出保存到一个临时文本文件中,但仍然不知道如何完全解决它。

这就是要解决的难题:

j s e t f l
a l s f e l
g a a n p l
e p f d p k
r e g e l a
f n e t e n

包含要使用的单词列表的文件位于http://pastebin.com/DP4mFZAr

我知道如何使用$ grep -Ff wordlist puzzle和如何使用$ rev puzzle | grep -Ff wordlist puzzle搜索镜像单词,从而处理水平行,但我如何处理垂直单词?

我正在讨论水平和垂直匹配。其主要思想是删除空格,然后将grep -f与存储在words文件中的给定单词列表一起使用。

对于grep -f,结果显示在线中。如果您只想查看匹配的测试,请使用grep -of

水平匹配

$ cat puzzle | tr -d ' ' | grep -f words
alsfel
gaanpl
regela
fneten
$ cat puzzle | tr -d ' ' | grep -of words
als
gaan
regel
eten

垂直匹配

为此,我们首先必须转换文件的内容。为此,我使用了我的另一个答案:

transpose () {
  awk '{for (i=1; i<=NF; i++) a[i,NR]=$i; max=(max<NF?NF:max)}
        END {for (i=1; i<=max; i++)
              {for (j=1; j<=NR; j++) 
                  printf "%s%s", a[i,j], (j<NR?OFS:ORS)
              }
        }'
}

让我们看看:

$ cat puzzle | transpose | tr -d ' ' | grep -f words
jagerf
slapen
esafge
tfndet
lllkan
$ cat puzzle | transpose | tr -d ' ' | grep -of words
jager
slapen
af
ge
de
kan

然后,您可以使用rev(正如您在问题中建议的那样)来表示镜像单词。此外,tac对于垂直镜像的单词可能是有趣的。

对角线匹配

对于对角线匹配,我认为一个有趣的方法是将每条线向左/向右移动一点。这样,

e x x x x
x g x x x
x x g x x

可以成为

e x x x x
g x x x
g x x

您可以使用垂直/水平方法。

为此,您可以使用printf,如使用printf格式的变量:中所述

$ cat a
e x x x x
x g x x x
x x g x x
$ awk -v c=20 '{printf "%*sn", c, $0; c-=2}' a
        e x x x x
        x g x x x
    x x g x x

最新更新