如果该行两次出现一个字符串,如何删除该行

时间:2018-11-28 00:20:34

标签: bash awk sed

我需要删除同一行中两次包含字符串的所有行。

示例:

hi 
hi hello
hi hello hey
hey hi:hello:hi #delete this line

结果:由于最后一行包含两次“ hi”。字符串不能用任何固定的分隔符正确地分隔,有时它是空格,逗号或冒号,也可以是任何东西。

hi 
hi hello
hi hello hey

如果它是基于固定列的数据,我本可以使用:(粗略的想法)

awk '{for(i=1;i<=NF;i++) if($i ~/hi/) c++ ;if(c<2) print $0}'

3 个答案:

答案 0 :(得分:3)

使用sed

可能会更容易
$ sed -E '/(\b\w+\b).*\b\1\b/d' file

如果重复一个单词,请删除该行。您必须使用单词边界定义单词,否则任何重复的字符都将与正则表达式匹配。

答案 1 :(得分:1)

请您尝试以下。

awk -F'[ :#]' '{for(i=1;i<=NF;i++){if(++a[$i]>1){delete a;next}};delete a} 1'   Input_file

输出如下。

hi
hi hello
hi hello hey

答案 2 :(得分:1)

您可以这样做:

awk -F'[ :;,]' '{ delete seen; for(i=1; i<=NF; i++) {seen[$i]++} # parse words and store in a hash             
       for(i in seen) if(seen[i] == 2) {next}                    # skip line if it has a word that is repeated two times
     }1' file