Awk 在文本文件的所有行中查找公共元素

Awk 在文本文件的所有行中查找公共元素,awk,Awk,我有一个文本文件,如: a b c d e b c e d f g e h c 我正在寻找一个简单的AWK,它可以输出所有行中的公共元素,忽略它们的第一个元素。所需输出为: c e 或 $cat tst.awk FNR==1{for(i=1;i$cat tst.awk FNR==1{对于(i=1;iperl进行救援: perl -lane ' my %seen; map { $total{$F[$_]}++ unless $seen{$F[$_]}++ } 1 .. $#F;

我有一个文本文件,如:

a b c d e
b c e
d f g e h c
我正在寻找一个简单的AWK,它可以输出所有行中的公共元素,忽略它们的第一个元素。所需输出为:

c e

$cat tst.awk
FNR==1{for(i=1;i
$cat tst.awk

FNR==1{对于(i=1;i
perl
进行救援:

perl -lane '
    my %seen;
    map { $total{$F[$_]}++ unless $seen{$F[$_]}++ } 1 .. $#F; 
}{ 
    print join " ", grep { $total{$_} == $. } keys %total
' file
e c
保留一个滚动的
%total
散列,仅当元素对于每一行都是唯一的时,该散列才会增加元素的数量。
%seen
是一个有助于跟踪这些元素的散列。因此,我们使用
my
声明为每一行重置它

END
块中,我们只是
grep
那些其值满足总行数的元素,因为这意味着它们可以在每一行上看到

命令行选项包括:

  • -l
    :在打印过程中选择换行符并将其放回原处
  • -a
    :在空白处拆分行,并用这些值加载数组
    @F
  • -n
    :创建一个
    while(){..}
    循环来处理每一行
  • -e
    :执行引号中的代码块

    • perl
      拯救:

      perl -lane '
          my %seen;
          map { $total{$F[$_]}++ unless $seen{$F[$_]}++ } 1 .. $#F; 
      }{ 
          print join " ", grep { $total{$_} == $. } keys %total
      ' file
      e c
      
      保留一个滚动的
      %total
      散列,仅当元素对于每一行都是唯一的时,该散列才会增加元素的数量。
      %seen
      是一个有助于跟踪这些元素的散列。因此,我们使用
      my
      声明为每一行重置它

      END
      块中,我们只是
      grep
      那些其值满足总行数的元素,因为这意味着它们可以在每一行上看到

      命令行选项包括:

      • -l
        :在打印过程中选择换行符并将其放回原处
      • -a
        :在空白处拆分行,并用这些值加载数组
        @F
      • -n
        :创建一个
        while(){..}
        循环来处理每一行
      • -e
        :执行引号中的代码块
      另一种perl方法:

      perl -lane '
          if ($. == 1) { %intersect = map {$_ => 1} @F; next } 
          %intersect =  map {$_ => 1} grep {$intersect{$_}} @F; 
          END {print join " ", keys %intersect}
      ' file
      
      结果不会按任何特定顺序排列。

      另一种perl方法:

      perl -lane '
          if ($. == 1) { %intersect = map {$_ => 1} @F; next } 
          %intersect =  map {$_ => 1} grep {$intersect{$_}} @F; 
          END {print join " ", keys %intersect}
      ' file
      

      结果不会按任何特定顺序排列。

      如果第2行包含“d”?如果第2行包含“d”?+1呢?很好!方法被盗并添加到我的答案中。如果你想偷回来并添加与你的awk等效的awk,请放心,我会将其从我的awk中删除。@EdMorton即使我尝试,我也不能使它像你的一样漂亮!
      :)在Perl中抛出GRIP或map的结果被认为是坏的形式。你可以考虑<代码>(1…$F){$${$F$[$}}}+,除非${$F[$$] }++}。
      @glennjackman是的,我只是想把它全部放在一行,用于一行解决方案,但要注意这一点。好吧,我的建议是一行。如果你想把
      用作语句修饰符:
      做{$total{$F[$\]}+,除非$seen{$F[$\]}++对于1..$#F;
      +1不错!方法被盗并在awk中添加到我的答案中。如果你想偷回来并添加与你的awk等效的awk,请放心,我会将其从我的awk中删除。@EdMorton即使我尝试,我也无法使它像你的一样漂亮!
      :)在Perl中抛出GRIP或map的结果被认为是坏的形式。你可以考虑<代码>(1…$F){$${$F$[$}}}+,除非${$F[$$] }++}。
      @glennjackman是的,我只是想在一行中为一行解决方案保留所有内容,但要注意这一点。好吧,我的建议是一行。如果你想
      做一个语句修饰符:
      做{$total{$F[$}++,除非$seen{$F[$}++}为1..$\F;
      perl -lane '
          if ($. == 1) { %intersect = map {$_ => 1} @F; next } 
          %intersect =  map {$_ => 1} grep {$intersect{$_}} @F; 
          END {print join " ", keys %intersect}
      ' file