Shell-Script

如果末尾沒有 S 的重複項在同一個列表中,如何刪除以字母 S 結尾的單詞?

  • June 1, 2016

我有一大串單詞。許多單詞之所以不同,只是因為它們的末尾有字母 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

引用自:https://unix.stackexchange.com/questions/286621