[英]Bash scripting, read two files line by line
我想打印第一個值(在 file2 中)大於 file1 的值。 為此,我有以下代碼:
file1="valueA.txt"
file2="valueB.txt"
while IFS= read -r line
do
printf '%s \n' "$line"
while IFS= read line1 && (( $(echo "$line > $line1" |bc -l ) ));
do
printf '%s \n' "$line1"
done <"$file2"
done <"$file1"
以下是 valueA.txt 的示例:
6.40693
14.2077
14.2829
50.7346
以下是 valueB.txt 的示例:
5.89669
28.4962
35.7508
36.2576
43.2666
93.3357
102.845
106.821
115.623
我的代碼應該這樣做:
打印 valueA.txt 的第一個值:“6.40693”
在 valueB.txt: "28.4962" 中打印第一個大於 6.40693 的值
打印 valueA.txt 的第二個值:“14.2077”
在 valueB.txt: "28.4962" 中打印第一個大於 14.2077 的值
等等。
但是,我在第二個 While 循環中沒有得到任何結果。
我懷疑這就是你想要的:同時從 2 個文件中讀取行:
while read -r a <&3 && read -r b <&4; do
if [[ $(bc -l <<< "$a > $b") == 0 ]]; then
printf "%f\n" "$b"
break
fi
done 3<valueA.txt 4<valueB.txt
使用awk
獲取文件 1 的最小值,然后再次使用awk
獲取第一個大於該最小值的值。
min_file1=$(awk 'NR == 1 { smallest=$1 }; NR > 2 && $1 < smallest { smallest=$1 }; END {print smallest}' file1)
awk -v x=$min_file1 '$1 > x {print $1; exit}' file2
與awk
輸入文件總是排序的。 您可以根據需要修改print
語句,我打印更多來演示它是如何工作的(並且您還沒有添加確切的示例輸出)。 可變resume
用於確保時間復雜度與文件長度保持線性關系。 用法: awk -f tst.awk file2 file1
。
> cat tst.awk
BEGIN { resume=1 }
NR==FNR { a[NR]=$0; next }
{
for (i=resume;i in a;i++) {
print("i=" i)
if (a[i]>$0) { print "First number found >=", $0, "is",a[i]
resume=i
break
}
}
}
測試:
> cat file1
6.40693
14.2077
14.2829
50.7346
100000
我添加了一個比所有數字都大的最終數字,它什么也不打印。
> cat file2
5.89669
28.4962
35.7508
36.2576
43.2666
93.3357
102.845
106.821
115.623
.
> awk -f tst.awk file2 file1
i=1
i=2
First number found >= 6.40693 : 28.4962
i=2
First number found >= 14.2077 : 28.4962
i=2
First number found >= 14.2829 : 28.4962
i=2
i=3
i=4
i=5
i=6
First number found >= 50.7346 : 93.3357
i=6
i=7
i=8
i=9
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.