행 삭제 구문

행 삭제 구문

이 구문을 사용하여 2.txt다음 행을 삭제합니다 1.txt.

awk 'NR==FNR{a[$0]=1;next}!a[$0]' 2.txt 1.txt  > lines.txt

내 행의 형식은 다음과 같습니다.

[email protected]:something

두 파일의 줄이 동일하면 이 내용이 없으므로 lines.txt괜찮습니다. 하지만 [email protected]동일하다면 줄을 삭제하고 다음 단어를 무시하고 싶습니다 :.

답변1

이것을 사용하십시오 :

awk -F: 'NR==FNR{a[$1]=1;next}!a[$1]' 2.txt 1.txt > lines.txt

-F:- 구분 기호를 :(콜론)으로 설정한 후 첫 번째 필드( $1)만 비교에 사용합니다.

답변2

다음을 수행해야 합니다.

  1. :필드 구분 기호를 사용하고 있다고 awk에 알리고
  2. 전체 행이 아닌 필드를 배열 인덱스로 사용하고
  3. 값 대신 인덱스가 존재하는지 테스트

즉, 이렇게 하세요:

awk -F':' 'NR==FNR{a[$1]; next} !($1 in a)' 2.txt 1.txt  > lines.txt

이렇게 하면 채우기를 먼저 읽은 다음 읽을 때 NR==FNR{a[$1]=1; next} !a[$1]불필요하게 메모리를 s로 채울 것입니다.12.txta[]1.txt $1해당 파일의 모든 내용을 추가합니다 .a[]그렇게 하면 a["foo"]인덱스에 불필요하게 더 많은 메모리를 소비하는 항목이 생성되어 스크립트 속도가 느려지고 두 번째 파일이 충분히 클 경우 스크립트가 실패할 수 있기 때문입니다.a[]"foo"

일반적으로 이러한 유형의 질문의 경우 첫 번째 파일은 두 번째 파일보다 훨씬 적은 값을 가지므로 두 방법 간의 시간 차이에 대한 아이디어를 제공하기 위해 file2의 값을 인쇄한다고 가정해 보겠습니다. file1에 1000줄이 있고 file2에 1천만 줄이 있다고 가정하면 file1의 줄 수는 다음과 같습니다. 다음 명령을 사용하여 입력을 생성할 수 있습니다.

$ awk 'BEGIN{for (i=1; i<=1000; i++) print "foo"i}' > file1
$ awk 'BEGIN{for (i=1; i<=10000000; i++) print "foo"i}' > file2

그런 다음 file2의 file1에 있는 줄 인쇄를 테스트합니다.

$ time awk 'NR==FNR{a[$0]=1;next}a[$0]' file1 file2 >/dev/null

real    0m4.279s
user    0m3.375s
sys     0m0.796s

$ time awk 'NR==FNR{a[$0];next}$0 in a' file1 file2 >/dev/null

real    0m1.453s
user    0m1.343s
sys     0m0.046s

그리고 file1에 없는 file2의 줄 인쇄를 테스트합니다.

$ time awk 'NR==FNR{a[$0]=1;next}!a[$0]' file1 file2 >/dev/null

real    0m5.549s
user    0m4.828s
sys     0m0.656s

$ time awk 'NR==FNR{a[$0];next}!($0 in a)' file1 file2 >/dev/null

real    0m2.701s
user    0m2.640s
sys     0m0.000s

관련 정보