Awk

當字元串出現在多行時,如何從文件中刪除行?

  • July 9, 2019

我有一個包含 2 列的文件,如下所示:

apple pear
banana pizza
spoon fork
pizza plate
sausage egg

如果一個單詞出現在多行上,我想刪除重複單詞出現的所有行,如您所見“pizza”出現兩次,因此應刪除 2 行,以下是所需的輸出:

apple pear
spoon fork
sausage egg

我知道使用:

awk '!seen[$1]++' 

但是,這只會在字元串出現在一列中時刪除行,我需要一個命令來檢查兩列。我怎樣才能做到這一點?

一個基本的兩步方法是創建一個非唯一單詞列表,並將其傳遞給grep -v.

對於第一部分,您可以使用sortand uniq -d(在序列化單詞之後 - 也許使用tr)或 - 如果您想繼續使用awk,例如:

awk -vRS='[ \t\n]' 'seen[$0]++' file

它將記錄拆分為空白並列印以前見過的記錄。所以

$ awk -vRS='[ \t\n]' 'seen[$0]++' file | grep -Fvf- file
apple pear
spoon fork
sausage egg

嘗試使用以下命令

for i in `cat filename| perl -pne "s/ /\n/g"| sort| uniq`; do j=`grep -c $i p.txt`; if [[ $j -eq 2 ]]; then sr=`echo $i`; else sed -n '/'$i'/p' p.txt| sed -n '/'$sr'/!p'; fi; done| awk '{if (!seen[$0]++)print $0}'

輸出

apple pear
sausage egg
spoon fork

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