시간이 걸리기 때문에 while 루프를 사용할 수 없습니다. 최종 파일을 얻는 더 빠른 방법이 있습니까? Linux에서 [복제]

시간이 걸리기 때문에 while 루프를 사용할 수 없습니다. 최종 파일을 얻는 더 빠른 방법이 있습니까? Linux에서 [복제]
cat file_1.txt

100 200 name

100 200

100 200

150 300

150 300

150 250

150 250

150 300 name


final file should be 

150 300

150 300

150 250

150 250

이 명령을 사용하고 있습니다

cat file_1.txt | grep -v "name">file_2.txt; cat file_2.txt| while read line;do cat file_1.txt| grep "$line"| head -1|grep -v "name" ;done

하지만 while 루프를 사용하기에는 데이터가 너무 많아서 while 루프를 사용하여 고양이를 만드는 데 시간이 많이 걸립니다. "grep -vf file_1 file_2"이와 같은 것을 사용하는 것처럼 이 작업을 빠르게 수행할 수 있는 다른 방법이 있습니까 ? 말해주세요.

여기서 내가 사용하는 논리는 패턴의 맨 위 행을 가져와서 패턴이 각 행임을 찾는 것입니다."file_1.txt"

답변1

name(a) 해당 줄에 포함 되거나 (b) 해당 줄의 처음 두 열이 포함된 이전 줄과 동일하지 않는 한 귀하의 코드는 file_1.txt의 모든 줄을 인쇄하는 것 같습니다 name. 이 경우 다음을 시도해 보세요.

$ awk '/name/{bad[$1,$2];next} !(($1,$2) in bad)' file_1.txt 
150 300
150 300
150 250
150 250

어떻게 작동하나요?

  • /name/{bad[$1,$2];next}

    현재 행에 다음이 포함되어 있으면 처음 두 열의 키 아래 name연관 배열에 항목을 추가합니다 . bad그런 다음 나머지 명령을 건너뛰고 다시 시작하기 위해 해당 줄로 이동합니다 next.

  • !(($1,$2) in bad)

    현재 행의 처음 두 열 $1,$2아니요key 를 bad누른 다음 이 줄을 인쇄하세요.

관련 정보