2016-12-19 8 views
3

파일 B의 문자열을 포함하는 파일의 모든 줄을 제거 파일 B의 문자열을 포함하는 이는내가 파일 리무버 라인이 텍스트 파일을 가지고 싶어

파일 A :

joe  ball  1335 
john dyer  1365 
dylan fisher 1795 
ian  gill  1913 
eric kelly 1101 

파일 B :

joe  ball  1335 
john dyer  1365 
eric kelly 1101 
,691 :

1795 
1913 

내가 배쉬 코드를 원하는이 같은 결과를 얻을 수 363,210

나는이 코드를 시도하지만 대답은

$ grep -vwF -f A B 
$ awk -F'[ ,]' 'FNR==NR{a[$1];next} !($4 in a)' 

답변

5
awk 'NR==FNR{a[$1];next} !($3 in a)' fileB fileA 

그것은 필드 구분자로 공간을 사용하고 $1은 행의 첫 번째 열 요소를 작동하지 않았다, $3은의 3 열 요소이다 선. 배열 a은 파일 B 요소 a[$1]을 저장합니다.

joe  ball  1335 
john dyer  1365 
eric kelly 1101 
+1

당신은'a [$ 1]'을 증가시키지 않을 수도 있습니다.'a [$ 1]; next'만으로 충분할 것입니다.'! ($ 3 in a)'는 awk를 사용하는 세련된 관용적 방법을 보여줍니다. +1 – sjsam

+1

@sjsam 동의합니다. 나는 그것을 편집 할 것입니다. – haifzhan

+0

Tanx Haifeng Zhang – pedram

0

grep 사용 : 라인 전체를 출력하지하면 어레이 a의 여부 FILEA 의 3 열 소자를 확인하는 간단한에 있지만 상황에서 충돌을 생성 할

$ grep -v -f B A 
joe  ball  1335 
john dyer  1365 
eric kelly 1101 

. 당신이 B을 난도질하는 경우와 약간의 예를 sed 첫 번째 (검색 문자열의 끝에 처음으로 공간과 $ 추가)에 대한 :

$ sed 's/$/$/;s/^/ /' B 
1795$ 
1913$ 

및 프로세스 치환에서 사용 :

$ grep -v -f <(sed 's/$/$/;s/^/ /' B) A 
joe  ball  1335 
john dyer  1365 
eric kelly 1101 
-1

고양이 file_B | 읽은 값들; grep $ 값을 수행하십시오 file_A >> newfile; done

+0

작은 코드에서 많은 오류가 있습니다 ... UUOC, IFS 설정 누락, 읽기 인수, 인용 부호가없는 변수, 원하는 필드 대신 전체 라인 일치 루프 밖에서 한 번 쓰는 대신 루프에 파일을 추가하고 [셸 루프를 사용하여 텍스트를 조작] (http://unix.stackexchange.com/questions/169716/why-is-using-a) - 쉘 - 루프 - 프로세스 - 텍스트 - 고려 - 나쁜 - 관행). –

+0

eror, no. 그것은 작동하고 질문에 답합니다. 귀하의 링크도 관련이 없습니다. – RJJ

+0

UUOC은 자신 만의 약어를 가지고있을뿐만 아니라 자신 만의 웹 페이지이기 때문에 소수를 잘 생각합니다. 문제없이 20 개의 쓸모없는 명령 (예 :'awk '1'| tr 'a' 'a s's/x/x '|')을 추가 할 수는 있습니다. 제가 제공 한 링크는 매우 관련이 있습니다. 모든 점을 이해하고 그 점을 이해할 때까지 질문하십시오. 사람들은 자신의 문제를 시연하는 단순하고 최소의 예를 제공해야합니다. YMMV는 게시하는 내용이 실제 입력/문제의 전체 범위라고 가정합니다. –