Extensions.txt
2つのファイル(と)を比較しようとしていますTemp.txt
。Extensions.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
使用できます。tmp
tmp
答え4
また使用できますjoin
。
join -t"/" -a1 -e " " -o '1.1,2.1,2.2' <(awk '{ print $1"/"}' Extension.txt ) <( awk '{ print $0}' Text.txt)