簡體   English   中英

Bash 腳本,逐行讀取兩個文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM