使用 bash 脚本比较两个文件不起作用

Compare two files using bash script not working

我试图比较两个文件以检查一个文件的内容是否在另一个文件中。 下面如果使用代码片段, file1 只是数字,file2 在一行中包含该 id 的详细信息(包括 id)。 但是这段代码不起作用,它总是显示 'not found'。我已经阅读了很多 SO 帖子,看看我做错了什么;也尝试添加“-Fxq”标志,但无济于事。如果我做一个手册 grep "id" file2.csv,它会起作用。 知道发生了什么事吗?需要 运行 时间 bash 变量扩展之类的东西?

#!/bin/bash
input="file1.csv"
orders="file2.csv"
while IFS= read -r line
do
    echo "$line"
    if grep "$line" "$orders"; then
      echo "Found..."
    else
      echo "NOT FOUND"
    fi
done < "$input"

建议尝试 gawk 脚本:

gawk '
   FNR==NR {file1[NR]=[=10=]; next} # Read all lines file1.csv into array file1
   {print; foundit=match([=10=],file1[FNR])} # print current line from file2.csv, and test line match corresponding data from file1.csv
   foundit {print "found in line."; next} # when reading file2.csv and mathed. print the match and read next line.
   {print "unmatched. "file1[FNR]} # if got here lines not match. print it.
 ' file1.csv file2.csv

请注意 file1.csv 中的数字可以匹配为大量 sub-strings。

例如,如果 file1.csv 中的第 1 行是 11 并且 file2.csv 中的第 1 行是 3115,它将匹配。

如果您在第 2 行细化 match() 函数,则可以轻松细化匹配。

万一有人在寻找解决方案,问题是读取的行末尾有 \r。清理完毕后,grep 开始匹配行。

#!/bin/bash -x
input="missing.txt"
orders="detailed.csv"
while IFS= read -r line
do
    echo "$line"
    id="${line/$'\r'/}"
    if grep -q "$id" "$orders"; then
      echo "Found..."
    else
      echo "NOT FOUND"
    fi
done < "$input"