이 구문을 사용하여 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
다음을 수행해야 합니다.
:
필드 구분 기호를 사용하고 있다고 awk에 알리고- 전체 행이 아닌 필드를 배열 인덱스로 사용하고
- 값 대신 인덱스가 존재하는지 테스트
즉, 이렇게 하세요:
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로 채울 것입니다.1
2.txt
a[]
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