grep 및 파일 쓰기 속도 향상
Aug 18 2020
누구의 도움을 주시면 감사하겠습니다. 현재 2 개의 파일 (둘 다 같은 형식)이 있고 둘 다 각각 2 백만 줄이 넘습니다. 아래 파일의 예 :
파일 1 :
00000001 YYYY
00000002 NYNN
00000003 YNYN
...
...
파일 2 :
00000001 YYNY
00000002 NYNN
00000003 YNYN
...
...
따라서 각 파일의 첫 번째 줄이 다르므로 파일 3에 인쇄합니다.
00000001 YYYY
위의 프로세스를 수행하기 위해 bash 스크립트가 있습니다.
- 파일 2의 처음 8 자 grep.
- grep의 에코 / 출력을 파일 1의 줄과 비교합니다.
- 다른 경우 파일 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