감사합니다
이
$ grep -vf fileA fileB
DaDa 43 Gk
PkPk 22 Aa
이에서 패턴을 얻기 위해 fileA
를 사용합니다. 그런 다음 -v
이 일치를 반전합니다.
AwkMan 주소가 제대로 일치하지 않는 이유를 잘 설명합니다. 지금, 당신의 솔루션을 연마 필요가있는 보자 :
귀하의 코드는 다음과 같습니다
for i in `cat FileA`
do
cat FileB | awk '{ if ($1!='$i') print $0_}'>> Result
done
Why you don't read lines with "for"이 잘 설명합니다. 그래서 당신은 뭔가 Read a file line by line assigning the value to a variable 설명처럼 말을해야합니다 :
while IFS= read -r line
do
cat FileB | awk '{ if ($1!='$i') print $0_}'>> Result
done < fileA
을 그런 다음 cat file | awk '...'
을 말하고있다. 이를 위해, awk '...' file
충분하다 : 당신이 명확 명령 그래서
또한
while IFS= read -r line
do
awk '{ if ($1!='$i') print $0_}' FileB >> Result
done < fileA
가, 리디렉션이의 done
의 끝에서 수행 할 수 있습니다 :
while IFS= read -r line
do
awk '{ if ($1!='$i') print $0_}' FileB
done <fileA>> Result
이 awk
너무 여러 번 호출입니다 유용하지 FNR==NR
trick을 사용하여 두 파일을 함께 처리 할 수 있습니다.
이제 awk
에 입력 해 보겠습니다. 여기에서는 결과를 비교하기 위해 일종의 변수를 사용하려고합니다. 그러나 $i
은 awk
이 아닙니다.당신은 같은 문장이있을 때 또한
:
awk '{if (condition) print $0}' file
을 그것은 말할 동일합니다 {print $0}
는 조건이 true로 평가 때 수행 할 기본 동작은
awk 'condition' file
때문입니다. awk
가 모두 함께 var
은 내부적
을 사용하면 다음 awk -v var="$shell_var"
을 사용할 필요가 bash는 변수를 사용할 수 있도록하기 위해 또한
는, 당신은 말을해야 뭔가 같은 :
while IFS= read -r line
do
awk -v var="$line" '$1 != var' FileB
done <fileA>> Result
하지만 통해 반복되기 때문에 여러 번 파일을 여러 번 인쇄합니다. 그래서 당신은이 대답까지 계속 나아가 야하고 grep -vf fileA fileB
을 사용해야합니다.
코드를'IFS = read -ri while '으로 업데이트 한 후, 필요한 경우 질문을 업데이트하십시오. awk -v i = "$ i" '$ 1! = i {print $ 0}'FileB; 완료 < FileA > 결과'. ([배쉬 FAQ 001] (http://mywiki.wooledge.org/BashFAQ/001) 참조.) – chepner