独特的线条搭配独特的文字

独特的线条搭配独特的文字

帮助我在 Linux 中打印独特的行。单词示例如

A B
B C
C D
A E
F G
H I
I J

输出应该是

F G
H I

即,该行首先应该是唯一的,并且该行中的单词也应该只出现一次,如上例所示,“FG”是唯一的行,并且“F”或“G”在任何其他行中都不存在,类似于“HI” 。

答案1

您可以获得独特单词的列表。然后,匹配行将是所有单词都是唯一的行:

tr -cs 'A-Z' '[\n*]' < words.txt |
  sort |
  uniq -u |
  perl -lne '
    if ($ARGV eq "-") {
      $u{$_}=1;
      next
    }
    for $w (/[A-Z]+/g) {
      next LINE unless $u{$w}
    }
    print' - words.txt

更改A-Z为构成单词的字符列表。

答案2

你可以用 awk 这样做:

独特的.awk

FNR == NR {
  for(i=1; i<=NF; i++)
    if(++w[$i] > 1)
      not_unique[$i] = 1
  next
}

{
  for(i=1; i<=NF; i++)
    if(not_unique[$i])
      next
}

1

像这样运行它:

awk -f unique.awk infile infile

输出:

F G

作为单行:

awk 'FNR == NR { for(i=1; i<=NF; i++) if(++w[$i] > 1) not_unique[$i] = 1; next } { for(i=1; i<=NF; i++) if(not_unique[$i]) next } 1' infile infile

解释

该文件需要解析两次,首先查找所有非唯一单词,然后打印仅包含唯一单词的那些行。这反映在程序结构中,第一个块创建一个包含不唯一单词的哈希,第二个块检查每一行,如果有不唯一的单词则跳过它。1仅当出现唯一行并且调用 awk 的默认操作 ( ) 时才会到达末尾的尾随{ print $0 }

相关内容