2つのファイルを比較し、部分的に一致しない行を追加する方法は?

2つのファイルを比較し、部分的に一致しない行を追加する方法は?

Extensions.txt2つのファイル(と)を比較しようとしていますTemp.txtExtensions.txt部分的に一致しない行がある場合、Temp.txt欠落している行をTemp.txt

Extensions.txt(非常に基本、1列):

111
1234
4321

Temp.txt:

1234/sip:[email protected]:5060  9421b96c5e   Avail   1.480
4321/sip:[email protected]:5060  e9b6b979a4   Avail   1.855

基本的に私が望むのは、/最初の列で前のすべての項目に基づいて一致を見つけることです。一致がない場合は、一致しない行をファイルの一番下に印刷して、次のように終了します。

1234/sip:[email protected]:5060  9421b96c5e   Avail   1.480
4321/sip:[email protected]:5060  e9b6b979a4   Avail   1.855
111

これまでこれを試してみましたが、grep -v望む結果は出ませんでした。私も試してみましたawkが、これが行く方法だと思いますが、awk適切な結果を得るためにどのように機能するかを完全に理解していません。

答え1

次のコマンドを使用してファイルを解析できます。awk

awk -F '/' '
    FNR == NR {seen[$1] = $0; next}
    {if ($1 in seen) print seen[$1]; else missing[$1]}
    END {for (x in missing) print x}
' Temp.txt Extensions.txt

出力:

1234/sip:[email protected]:5060 9421b96c5e Avail 1.480
4321/sip:[email protected]:5060 e9b6b979a4 Avail 1.855
111
  • フィールド区切り記号をスラッシュに設定し、-F '/'
  • FNR == NR最初の入力ファイルの行で、次の操作を実行します。seen行を連想配列のキーとして保存し、その行に移動しますnext
  • このとき、2番目のファイルに対して2番目の操作が行われますFNR != NR。最初のフィールドが一致した場合は、保存した行を印刷し、elseそのフィールドを別の配列に保存しますmissing
  • ではEND、欠落している行を印刷します。

答え2

Extensions.txt配列の内容を読み込み、部分的に一致する項目を削除し、残りを印刷できます。

$ awk -F/ '
    NR==FNR {a[$1]; next} {for(i in a) if($1 ~ i) delete a[i]} END{for(i in a) print i} 1
  ' Extensions.txt Temp.txt
1234/sip:[email protected]:5060  9421b96c5e   Avail   1.480
4321/sip:[email protected]:5060  e9b6b979a4   Avail   1.855
111

答え3

grep+を使用してくださいcut

grep -xvFf <(cut -d'/' -f1 tmp) ext >> tmp

ここでは、パターンが追加されたパターンで同じファイルに結果を供給して書き戻すため、プロセス置換の入力を安全にgrep使用できます。tmptmp

サブシェルの入力と親シェルの出力に同じファイル名を使用すると競合が発生しますか?

答え4

また使用できますjoin

join -t"/" -a1 -e " " -o '1.1,2.1,2.2' <(awk '{ print $1"/"}' Extension.txt ) <( awk '{ print $0}' Text.txt)

関連情報