加快grep并写入文件

问题描述

我会感谢任何人的帮助。目前,我有2个文件(两个文件的格式相同),每个文件中的行数都超过200万。以下文件示例:

文件1:

00000001 YYYY
00000002 NYNN
00000003 YNYN
...
...

文件2:

00000001 YYNY
00000002 NYNN
00000003 YNYN
...
...

所以请注意每个文件的第一行都不同,所以我将打印到文件3:

00000001 YYYY

要执行上述过程,我需要一个bash脚本:

  1. grep文件2的前八个字符。
  2. 我将grep的回显/输出与文件1中的行进行比较。
  3. 如果它们不同,则将行(从文件1)写入文件3。

我想提供示例代码,但请记住,我只是在运行过程中对其进行了补充,但其概念与我的脚本相同。目前,我是24小时营业,在200万中只有24万在线。如何有效地加快速度?

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"

解决方法

使用Python脚本是如此简单

Python具有zip函数,可用于逐行读取和比较两个文件。

示例Bash脚本:

echo '00000001 YYYY
00000002 NYNN
00000003 YNYN' >file1


echo '00000001 YYNY
00000002 NYNN
00000003 YNYN' >file2

python3 -c '
with open("file1") as f_1,open("file2") as f_2:
   for t in zip(f_1,f_2):
      if t[0][8:-1] != t[1][8:-1]: print(t[0])'

打印:

00000001 YYYY

这里的优势(例如,相对于简单的awk脚本而言),每个文件中只有一行位于活动内存中-正在比较这两行。

但是,Unix对于上述问题还有其他解决方案。您还可以使用pasteawk

paste file1 file2 | awk '$2!=$4 {print $1 OFS $2}'

或者,如果第一列中的数字用作索引,则可以使用join和awk:

join file1 file2 | awk '$2!=$3 {print $1 OFS $2}'

如果每个文件中的第1列已排序,也可以使用comm命令(抑制col 1和col 3):

comm -1 -3 file1 file2

所有三个Unix / Linux命令/管道均产生:

00000001 YYYY

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...