시간이 걸리기 때문에 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~ 아니다의 키 중에서 bad다음 줄을 인쇄하세요.

관련 정보