【发布时间】:2020-12-07 05:15:04
【问题描述】:
我会感谢任何人的帮助。目前,我有 2 个文件(格式相同),每个文件都有超过 200 万行。以下文件示例:
文件 1:
00000001 YYYY
00000002 NYNN
00000003 YNYN
...
...
文件 2:
00000001 YYNY
00000002 NYNN
00000003 YNYN
...
...
所以请注意每个文件中的第一行是不同的,所以我将打印到文件 3:
00000001 YYYY
要完成上述过程,我有一个 bash 脚本:
- grep 文件 2 的前八个字符。
- 我将 grep 的回显/输出与文件 1 中的行进行比较。
- 如果它们不同,则将行(从文件 1)写入文件 3。
我想提供示例代码,但请记住,我只是动态编造的,但它的概念与我的脚本相同。目前,我 24 小时在线,只有 200 万在线 240k。我怎样才能以有效的方式加快速度?
input="file1"
while IFS= read -r line
do
LineFromFile1=$("${echo $line}")
firstEightChars=$("${echo $line:0:8}")
if grep -q "$firstEightChars" file2; then
$LineFoundInFile2="$(grep $firstEightCharst file2)"
if [[ $line == $LineFoundInFile2 ]]; then
:
else
echo $line >> file3
done < "$input"
【问题讨论】:
-
对两个文件进行排序,然后对它们进行比较 (n*log(n)) 比这种方法 (n^2) 更快。此外,您的示例将无法正确运行并且有多个拼写错误,并且每次匹配您 grep file2 两次。
-
我想你想看看
comm命令。我从未使用过它,但手册页上说它用于“选择或拒绝两个文件共有的行”,这听起来像你想要的 -
join file1 file2 | egrep -v '( [^ ]*)\1' | cut -d' ' -f1-2如果两个文件都在第一个字段上排序。 -
两个文件的行数是否相同,两个文件的第一列是否完全相同?
-
@Cyrus 文件的行数不同,但第一列总是 8 个字符。