我在编写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添加到array_1,对于另一个array_2的var_2也是如此,然后我不得不将所有元素与每个其他。
但我不知道该怎么做。我希望有一个人可以帮助我。
答案 0 :(得分:2)
使用awk
awk 'FNR==NR {a[$1]++;next} ($2 in a) {print $2}' file file
4.08
1.38
读取文件并在数组a
中存储第1列,然后将第2列与数组a
进行比较
cat file
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
4.08 1.38
答案 1 :(得分:1)
此行应该有效:
awk '{a[$1]=1;b[$2]}END{for(x in b){a[x]++;if(a[x]>1)print x}}' file
请注意,END中的循环和检查用于排除同一列中的重复数字。如果每个col都有唯一的编号,那么该部分可以简化。
使用fedorqui的例子,输出是:
4.08
1.38
cat file
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
4.08 1.38
答案 2 :(得分:1)
一行,转换为一列,排序并使用uniq仅打印重复:
(awk '{print $1}' test_input|sort|uniq ; awk '{print $2}' test_input|sort|uniq)|sort|uniq -d
答案 3 :(得分:0)
按照您描述的方式运行的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
答案 4 :(得分:0)
使用awk而不读取文件两次。
awk '{a[$1];b[$2];for (i in b) if (i in a) {print i;delete a[i];delete b[i]}}' file
答案 5 :(得分:0)
awk '{ a[$1]; b[$2] }
END{
for (x in a) {
for (y in b) {
if (x+0 == y) {
print x
break
}
}
}
}' file