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;iperl
进行救援:
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