ありがとうあなただけgrep
が必要になります。
$ 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
の終わりに行うことができる:awk
何度も呼び出す
while IFS= read -r line
do
awk '{ if ($1!='$i') print $0_}' FileB
done <fileA>> Result
は有用ではありませんFNR==NR
trickを使用して2つのファイルを一緒に処理することができます。
今度はawk
と入力してください。ここでは、ある種類の変数を使用して結果を比較したいとします。ただし、$i
はawk
にはありません。また
、あなたのような文がある場合:
awk '{if (condition) print $0}' file
をそれは言って同じです:
awk 'condition' file
{print $0}
は、条件がtrueと評価されたときに実行するデフォルトのアクションですので。
また、awk
あなたはawk -v var="$shell_var"
を使用して、すべて一緒にvar
internally-を使用する必要が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}'を実行します。完了< FileA >結果 '。 ([Bash FAQ 001](http://mywiki.wooledge.org/BashFAQ/001)を参照してください。) – chepner