使用bash打印列中的常用值

时间:2018-06-21 23:03:43

标签: bash awk

我有两列文件

apple apple
ball cat
cat hat
dog delta

我需要提取两列(在两列中都出现)相同的值

apple apple
cat cat 

每列中的项目均无顺序。

4 个答案:

答案 0 :(得分:1)

能否请您尝试以下操作,如果有帮助,请告诉我。

awk '
{
  col1[$1]++;
  col2[$2]++;
}
END{
  for(i in col1){
    if(col2[i]){
      while(++count<=(col1[i]+col2[i])){
         printf("%s%s",i,count==(col1[i]+col2[i])?ORS:OFS)}
      count=""}
  }
}' Input_file

注意: :如果在两个列中找到的值也恰好出现在两个列中的次数,它将打印这些值。

答案 1 :(得分:0)

假设我可以使用Unix命令:

cut -d' ' -f2 fil | egrep `cut -d' ' -f1 < fil | paste -sd'|'` -

这基本上是什么:

第二个cut命令收集第一列中的所有单词。 paste命令将它们与管道连接(即dog|cat|apple)。

第一个cut命令将列表中的第二个单词作为单词,并将它们通过管道传递到启用了正则表达式的egrep命令中。

答案 2 :(得分:0)

这是我能得到的最近的东西。也许您可以遍历整个文件,然后在出现另一个文件时进行打印。

代码

cat file.txt | gawk   '$1==$2 {print $1,"=",$2}'

gawk '$1==$2 {print $1,"=",$2}' file.txt

答案 3 :(得分:0)

$ awk '{a[$1];b[$2]} END{for(k in a) if(k in b) print k}' file
apple
cat

将两次打印的值更改为print k,k

sort/join

$ join <(cut -d' ' -f1 file | sort) <(cut -d' ' -f2 file | sort)
apple
cat

也许

$ function f() { cut -d' ' -f"$1" file | sort; }; join <(f 1) <(f 2)