使用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任務(由我設定),併發布部分解決方案,並要求在堆棧交換解決方案是違反剽竊和合謀條例。如果您在使代碼正常工作時遇到問題,請向我或助教尋求幫助。請把這個問題刪除? –