使用AWK和sed的
awk 'function palindrome(str) {len=length(str); for(k=1; k<=len/2+len%2; k++) { if(substr(str,k,1)!=substr(str,len+1-k,1)) return 0 } return 1 } {for(i=1; i<=NF; i++) {if(length($i)>=3){ gsub(/[^a-zA-Z]/,"",$i); if(length($i)>=3) {$i=tolower($i); if(palindrome($i)) arr[$i]++ }} } } END{for(i in arr) print arr[i],i}' file | sed -E '/^[0-9]+ (.)\1+$/d'
测试在1.2GB文件和执行时间为〜400 40岁(i5-6440HQ @ 2.60GHz/4 cores/16GB)
说明:
awk '
function palindrome(str) # Function to check Palindrome
{
len=length(str);
for(k=1; k<=len/2+len%2; k++)
{
if(substr(str,k,1)!=substr(str,len+1-k,1))
return 0
}
return 1
}
{
for(i=1; i<=NF; i++) # For Each field in a record
{
if(length($i)>=3) # if length>=3
{
gsub(/[^a-zA-Z]/,"",$i); # remove non-alpha character from it
if(length($i)>=3) # Check length again after removal
{
$i=tolower($i); # Covert to lowercase
if(palindrome($i)) # Check if it's palindrome
arr[$i]++ # and store it in array
}
}
}
}
END{for(i in arr) print arr[i],i}' file | sed -E '/^[0-9]+ (.)\1+$/d'
sed -E '/^[0-9]+ (.)\1+$/d'
:从最终结果中检查哪些字符串是由重复的字符组成,如AAA
,BBB
等,并将其删除。
老答(编辑之前)
,如果你想你可以试试下面的步骤:
步骤1:预处理
删除所有不必要的字符,并将结果在临时文件中
tr -dc 'a-zA-Z\n\t ' <file | tr ' ' '\n' > temp
tr -dc 'a-zA-Z\n\t '
这将所有删除除字母,\n
,\t
,空间
tr ' ' '\n'
这将空间转换到\n
每个单词在换行分离
步骤2:处理
grep -wof temp <(rev temp) | sed -E -e '/^(.)\1+$/d' | awk 'length>=3 {a[$1]++} END{ for(i in a) print a[i],i; }'
grep -wof temp <(rev temp)
这会给你所有的回文
-w
:只选择那些包含匹配表单的行整个词。 例如:level
将不匹配与levelAAA
-o
:只打印匹配的组
-f
:要使用的每个字符串中temp
文件作为图案<(rev temp)
sed -E -e '/^(.)\1+$/d'
搜索:这将删除的同形成字信件像AAA
,BBBBB
awk 'length>=3 {a[$1]++} END{ for(i in a) print a[i],i; }'
:这将过滤使length>=3
单词和计数的频率,最后打印出结果
实施例:
输入文件:
$ cat file
kayak nalayak bob dad , pikachu. meow !! bhow !! 121 545 ding dong AAA BBB done
kayak nalayak bob dad , pikachu. meow !! bhow !! 121 545 ding dong AAA BBB done
kayak nalayak bob dad , pikachu. meow !! bhow !! 121 545 ding dong AAA BBB done
输出:
$ tr -dc 'a-zA-Z\n\t ' <file | tr ' ' '\n' > temp
$ grep -wof temp <(rev temp) | sed -E -e '/^(.)\1+$/d' | awk 'length>=3 {a[$1]++} END{ for(i in a) print a[i],i; }'
3 dad
3 kayak
3 bob
你想算回文数,还是要数*每个回文*文本文件中出现的次数? – Socowi
这个问题涉及一个courswork任务(由我设定),并发布部分解决方案,并要求在堆栈交换解决方案是违反剽窃和合谋条例。如果您在使代码正常工作时遇到问题,请向我或助教寻求帮助。请把这个问题删除? –