问题描述
我会感谢任何人的帮助。目前,我有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万中只有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对于上述问题还有其他解决方案。您还可以使用paste和awk
:
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