Linux 用于比较列中的数字的Bash脚本

Linux 用于比较列中的数字的Bash脚本,linux,bash,awk,Linux,Bash,Awk,我在编写bash脚本时遇到问题,希望有人能帮我解决这个问题。 我以前在bash中编写过一些较小的脚本,所以我并不完全是新手,但仍有很大的改进空间 因此,我有一个只包含两列十进制数字的文件,如: 0.46 0.68 0.92 1.36 1.38 2.04 1.84 2.72 2.3 3.4 2.76 4.08 3.22 4.76 3.68 5.44 4.14 6.12 ... 我要做的是将第一列中的每个数字与第二列中的每个数字进行比较,检查

我在编写bash脚本时遇到问题,希望有人能帮我解决这个问题。 我以前在bash中编写过一些较小的脚本,所以我并不完全是新手,但仍有很大的改进空间

因此,我有一个只包含两列十进制数字的文件,如:

0.46    0.68
0.92    1.36
1.38    2.04
1.84    2.72
 2.3    3.4
2.76    4.08
3.22    4.76
3.68    5.44
4.14    6.12
...
我要做的是将第一列中的每个数字与第二列中的每个数字进行比较,检查是否有任何两个数字相等,然后将此数字打印到屏幕或文件中

我在excel表格中找到了一个答案,但我对如何在bash或awk中实现这一点非常感兴趣

我的第一个问题是,我甚至不知道如何将第一个数字与第二列中的所有其他数字进行比较。 我想我必须通过数组来实现这一点。我可以通过'while read var_1 var_2'命令读取这两个数字,然后我必须以某种方式将每行的var_1添加到一个数组_1,对于另一个数组_2,var_2也是如此,然后我必须以某种方式将所有元素相互比较

但我不知道怎么做。我希望有人能帮助我

这条线应该可以工作:

 awk '{a[$1]=1;b[$2]}END{for(x in b){a[x]++;if(a[x]>1)print x}}' file
请注意,循环和签入结束用于排除同一列中的重复编号。如果每个列都有唯一的编号,则可以简化该部分

以fedorqui为例,输出为:

4.08
1.38

这条线应该可以工作:

 awk '{a[$1]=1;b[$2]}END{for(x in b){a[x]++;if(a[x]>1)print x}}' file
请注意,循环和签入结束用于排除同一列中的重复编号。如果每个列都有唯一的编号,则可以简化该部分

以fedorqui为例,输出为:

4.08
1.38

使用
awk

awk 'FNR==NR {a[$1]++;next} ($2 in a) {print $2}' file file
4.08
1.38
读取文件并将列#1存储在数组
a
,然后将列#2与数组
a

使用
awk

awk 'FNR==NR {a[$1]++;next} ($2 in a) {print $2}' file file
4.08
1.38
读取文件并将列#1存储在数组
a
,然后将列#2与数组
a


按照您描述的方式工作的bash解决方案:

#!/bin/bash

while read c1 c2 ;do
    c1a=("${c1a[@]}" "$c1")
    c2a=("${c2a[@]}" "$c2")
done < numbers.txt

for c1 in ${c1a[@]} ;do
    for c2 in ${c2a[@]} ;do
        [[ $c1 == $c2 ]] && echo $c1
    done
done
#/bin/bash
读c1-c2时;做
c1a=(“${c1a[@]}”“c1”)
c2a=(“${c2a[@]}”“c2”)
完成
一个按照您描述的方式工作的bash解决方案:

#!/bin/bash

while read c1 c2 ;do
    c1a=("${c1a[@]}" "$c1")
    c2a=("${c2a[@]}" "$c2")
done < numbers.txt

for c1 in ${c1a[@]} ;do
    for c2 in ${c2a[@]} ;do
        [[ $c1 == $c2 ]] && echo $c1
    done
done
#/bin/bash
读c1-c2时;做
c1a=(“${c1a[@]}”“c1”)
c2a=(“${c2a[@]}”“c2”)
完成
一行,转换为一列,排序并使用uniq仅打印副本:

(awk '{print $1}' test_input|sort|uniq  ; awk '{print $2}' test_input|sort|uniq)|sort|uniq -d

一行,转换为一列,排序并使用uniq仅打印副本:

(awk '{print $1}' test_input|sort|uniq  ; awk '{print $2}' test_input|sort|uniq)|sort|uniq -d

使用awk而不读取文件两次

awk '{a[$1];b[$2];for (i in b) if (i in a) {print i;delete a[i];delete b[i]}}' file

使用awk而不读取文件两次

awk '{a[$1];b[$2];for (i in b) if (i in a) {print i;delete a[i];delete b[i]}}' file


嘿,谢谢你的回答。这是可行的,但是输出中的顺序号被弄乱了,所以很难找到最低值。@user3197817为什么这个答案和Jotne的答案给出相同的输出,一个“完美”一个“混乱”?输出是相同的,没错,但顺序不同。Jotne的输出按顶部最小的数字排序,这对我来说更方便。@user3197817我按了
F5
检查了他的答案,没有排序。另外,在awk中,如果对(数组中的x)使用
,则不会进行排序。两个答案都是一样的。如果你想排序,你可以在awk中进行排序,或者直接将输出传输到
sort
。嗯,我只是将他的awk行复制到我的终端,并将输入重定向到终端,它会给我以最小开始、以最大结束的数字:15、31、46、62等等。嘿,谢谢你的回答。这是可行的,但是输出中的顺序号被弄乱了,所以很难找到最低值。@user3197817为什么这个答案和Jotne的答案给出相同的输出,一个“完美”一个“混乱”?输出是相同的,没错,但顺序不同。Jotne的输出按顶部最小的数字排序,这对我来说更方便。@user3197817我按了
F5
检查了他的答案,没有排序。另外,在awk中,如果对(数组中的x)使用
,则不会进行排序。两个答案都是一样的。如果你想排序,你可以在awk中进行排序,或者直接将输出传输到
sort
。嗯,我只是将他的awk行复制到我的终端,并将输入重定向到终端,它会给我从最小开始到最大的数字:15、31、46、62等等。
转换为一列,排序并使用uniq
不是一个好主意。如果在同一列中有重复项怎么办?除了
awk;awk;分类uniq
@Kent thx为了发表评论,我添加了uniq以删除一列中的重复项,但您可以确定,链中有许多实用程序。我看到了uniq,它删除了col1和col2组合中的重复项。我的意思是,例如,在col1中有四个
foo
,但在col2中,根本没有
foo
。所以
foo
不应该在输出中。@Kent排序| uniq也可以用于从一列中删除重复项,但现在它非常复杂,我同意。
转换为一列,排序并使用uniq
不是一个好主意。如果在同一列中有重复项怎么办?除了
awk;awk;分类uniq
@Kent thx为了发表评论,我添加了uniq以删除一列中的重复项,但您可以确定,链中有许多实用程序。我看到了uniq,它删除了col1和col2组合中的重复项。我的意思是,例如,在col1中有四个
foo
,但在col2中,根本没有
foo
。所以
foo
不应该在输出中。@Kent排序| uniq也可以用于从一列中删除重复项,但现在它非常复杂,我同意。您是在寻找字符串还是数字相等?我的意思是如果“2.4”出现在第1栏,而“2.40”出现在第2栏