Shell-Script
如果末尾沒有 S 的重複項在同一個列表中,如何刪除以字母 S 結尾的單詞?
我有一大串單詞。許多單詞之所以不同,只是因為它們的末尾有字母 s。如果列表中的一個單詞與列表中的另一個單詞完全相同,除了其中一個單詞以字母 s 結尾,我想刪除以 s 結尾的重複單詞。我也想在不必對列表進行排序的情況下完成此操作,以便我可以保持單詞的目前位置。
範例輸入:
frog dogs cats cat dog frogs catfish octopus
範例輸出:
frog cat dog catfish octopus
使用 awk 並讀取文件兩次。將所有變數保存在以 s 結尾的數組中。在第二次遍歷中檢查每一行的數組,如果該行不在數組中,則列印。
awk 'FNR==NR{a[$0 "s"]++;next}!($0 in a)' file.txt file.txt
要使用更少的記憶體,您也可以這樣做
awk 'FNR==NR{!/s$/ && a[$0 "s"]++;next}!($0 in a)' file.txt file.txt
您可以通過多種方式執行此操作,例如,最簡單的方法是對數據進行排序並比較相鄰行:
sort foo |awk '{ if ( plural[$1] == "" ) print; plural[$1 "s"] = 1; }'
給定輸入
frog dogs cats catfish cat dog frogs
輸出
cat catfish dog frog
不排序:
#!/bin/sh awk 'BEGIN { count=0; } { words[count++] = $1; plurals[$1 "s"] = $1; } END { for ( n = 0; n < count; ++n) { if ( plurals[words[n]] == "") print words[n]; } } ' <foo
輸出:
frog catfish cat dog