次のテキストファイルがあります。
Name1 OpenFin
Name2 Chrome
Name3 OpenFin
Name4 Chrome
Name5 OpenFin
Name6 OpenFin
OpenFin
すべての行が最初に出てから、すべての行が来るようにソートしたいと思います。Chrome
これが私が今まで持っているものです:
grep OpenFin LoginExcInternal.txt | grep Chrome LoginExcInternal.txt > test.txt
答え1
あなたの要求を直接翻訳する:
すべてのストリップを含む行が
OpenFin
最初に表示され、次にすべてのストリップを含む行が表示されます。Chrome
...何が最初であるかわからないまま:
{ grep -F OpenFin LoginExcInternal.txt; grep -F Chrome LoginExcInternal.txt; } > test.txt
また、元のファイルに表示された順序で行を維持します(行全体がsort
整列するのを防ぐためにリングを通過する必要はありません)。
答え2
注文
grep OpenFin LoginExcInternal.txt | grep Chrome LoginExcInternal.txt > test.txt
Chrome
行の任意の場所に文字列を含む行のみが生データから生成されます。これは、パイプラインの右側がパイプラインの最初の結果をまったく処理しないためですgrep
(単に削除されました)。
grep
読み取るファイル名が与えられると、標準入力ストリームは処理されません。最初の結果は標準入力ストリームに到着しますgrep
。
sort -k2r LoginExcInternal.txt >test.txt
2番目の列の行が同じ列に含まれる行の後に表示されるようにChrome
します。OpenFin
上記の方法は、2番目の列の元のデータを辞書の逆順にソートする方法で機能します。
Flagは、ユーティリティに2番目の列のデータを逆順()でソートするように-k2r
指示しますsort
(または3つ以上の列がある場合はソートを続けます)r
。 2行の2番目の列に同じ値がある場合、行全体がソートキーとして使用されます。
~と一致する他の人2 番目の列の値は残りの行と並べ替えられ、出力にも含まれます。
データの元の順序に興味があり、それを変更したくなく、2番目の列にこれら2つの値を含む行のみを抽出したいと仮定した場合(他の値を除く)、2つのステップを実行してください。 :
awk -v value='OpenFin' '$2 == value' LoginExcInternal.txt >test.txt
awk -v value='Chrome' '$2 == value' LoginExcInternal.txt >>test.txt
awk
これは、変数の値が異なる元のデータに同じコードを2回適用しますvalue
。このコードは、2番目の列でのみ文字列比較を実行し、指定された値を持つ行を印刷します。スクリプトの最初の実行は値をawk
実行し、2番目の実行はその値に行を追加します。OpenFin
Chrome
これは関連を避ける最初データ比較列Chrome
の場合、最初の列の値のいずれか、またはそれが問題になりますOpenFin
。また、awk
コードは文字列比較を使用するため、2番目の列に次の文字列のいずれかを含めることができる行が出力されるのを防ぎます。サブストリング。
答え3
これは、ユーザー「emirn」が回答した後に何らかの理由で削除されました。しかし、彼らの反応は非常に効果的でした。
次の2つのコマンドを実行するように指示されました。
cat LoginExcInternal.txt | grep OpenFin >> test.txt
cat LoginExcInternal.txt | grep Chrome >> test.txt
ありがとう、エミル!