使用 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"
我试图比较两个文件以检查一个文件的内容是否在另一个文件中。
下面如果使用代码片段,
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"