[英]Bash script for comparing numbers in columns
我在編寫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中,將var_2相同地添加到另一個array_2中,然后我必須以某種方式比較所有元素其他。
但是我不知道該怎么辦。 我希望有一個人可以幫助我。
使用awk
awk 'FNR==NR {a[$1]++;next} ($2 in a) {print $2}' file file
4.08
1.38
讀取文件並將第1列存儲在數組a
,然后將第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
這行應該工作:
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
一行,轉換為一列,排序並使用uniq僅打印重復項:
(awk '{print $1}' test_input|sort|uniq ; awk '{print $2}' test_input|sort|uniq)|sort|uniq -d
一個按照您描述的方式工作的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
使用awk兩次不讀取文件。
awk '{a[$1];b[$2];for (i in b) if (i in a) {print i;delete a[i];delete b[i]}}' file
awk '{ a[$1]; b[$2] }
END{
for (x in a) {
for (y in b) {
if (x+0 == y) {
print x
break
}
}
}
}' file
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.