BASH Finding palindromes in a .txt file

泪湿孤枕 提交于 2019-12-04 05:51:30

问题


I have been given a .txt file in which we have to find all the palindromes in the text (must have at least 3 letters and they cant be the same letters e.g. AAA)

it should be displayed with the first column being the amount of times it appears and the second being the word e.g.

123 kayak

3 bob

1 dad

#!/bin/bash

tmp='mktemp'

awk '{for(x=1;$x;++x)print $x}' "${1}" | tr -d [[:punct:]] | tr -s [:space:] | sed -e 's/@//g' -e 's/[0-9]*//g'| sed -r '/^.{,2}$/d' | sort | uniq -c -i > tmp1

This outputs the file as it should do, ignoring case, words less than 3 letters, punctuation and digits.

However i am now stump on how to pull out the palindromes from this, i thought a temp file might be the way, just don't know where to take it.

any help or guidance is much appreciated.


回答1:


# modify this to your needs; it should take your input on stdin, and return one word per
# line on stdout, in the same order if called more than once with the same input.
preprocess() {
  tr -d '[[:punct:][:digit:]@]' \
    | sed -E -e '/^(.)\1+$/d' \
    | tr -s '[[:space:]]' \
    | tr '[[:space:]]' '\n'
}

paste <(preprocess <"$1") <(preprocess <"$1" | rev) \
  | awk '$1 == $2 && (length($1) >= 3) { print $1 }' \
  | sort | uniq -c

The critical thing here is to paste together your input file with a stream that has each line from that input file reversed. This gives you two separate columns you can compare.



来源:https://stackoverflow.com/questions/46744958/bash-finding-palindromes-in-a-txt-file

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!