grep 및 파일 쓰기 속도 향상

Aug 18 2020

누구의 도움을 주시면 감사하겠습니다. 현재 2 개의 파일 (둘 다 같은 형식)이 있고 둘 다 각각 2 백만 줄이 넘습니다. 아래 파일의 예 :

파일 1 :

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

파일 2 :

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

따라서 각 파일의 첫 번째 줄이 다르므로 파일 3에 인쇄합니다.

00000001 YYYY

위의 프로세스를 수행하기 위해 bash 스크립트가 있습니다.

  1. 파일 2의 처음 8 자 grep.
  2. grep의 에코 / 출력을 파일 1의 줄과 비교합니다.
  3. 다른 경우 파일 1의 행을 파일 3에 씁니다.

나는 샘플 코드를 제공하고 싶었지만, 나는 이것을 즉석에서 만들었지 만 그것은 나의 스크립트와 같은 개념임을 명심하라. 현재 저는 2 백만 중 24 시간 동안에 만 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"

답변

5 dawg Aug 18 2020 at 11:06

이것은 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에는 설명 된 문제에 대한 다른 솔루션이 있습니다. 붙여 넣기 및 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