6

複数の文字列の最初の出現を返そうとしています。つまり、次のテキストから 1259、3009、および 1589 が最初に出現する行を選択したいと考えています。

ADWN    1259    11:00   B23

ADWN    3009    12:00   B19

DDWN     723    11:30   B04

ADWN    1589    14:20   B12

ADWN    1259    11:10   B23

DDWN    2534    13:00   B16

ADWN    3009    11:50   B14

これにより、すべての一致が得られます。

grep '1259\|3009\|1589'  somelog.log

そして、これは私に最初の試合だけを与えます

grep -m 1  '1259\|3009\|1589'  somelog.log

以下のものを返品したいです。

ADWN    1259    11:00   B23

ADWN    3009    12:00   B19

ADWN    1589    14:20   B12

必要な値を含むファイルを作成し、ファイルをループして、各番号を個別に grep コマンドに渡すと、探しているものが得られると思いますが、この例は見つかりませんでした。これに対する簡単な解決策はありますか、これを処理する最善の方法はループですか、それともこの例はすでに他の場所で回答されていますか?

アイデアや提案をお寄せいただきありがとうございます --

クライド

4

4 に答える 4

4

を使用した片道awk

awk '!array[$2]++ && $2 ~ /^1259$|^3009$|^1589$/' file.txt

結果:

ADWN    1259    11:00   B23
ADWN    3009    12:00   B19
ADWN    1589    14:20   B12

編集:

最初に質問全体を読む習慣を身につけるべきです。最初に見つかった値を見つけたい値でファイルを作成しようと考えているようです。これらをvalues.txt1 行に 1 つの値で呼び出されるファイルに入れます。例えば; の内容は次のvalues.txtとおりです。

1259
3009
1589

次に、これを実行します。

awk 'FNR==NR { array[$0]++; next } $2 in array { print; delete array[$2] }' values.txt file.txt

結果:

ADWN    1259    11:00   B23
ADWN    3009    12:00   B19
ADWN    1589    14:20   B12

最初のコマンドの説明:

2 番目の列 ( $2) がリストされている 3 つの値のいずれかと等しい場合、それが配列にない場合は追加します。awkデフォルトで行全体を印刷します。

2 番目のコマンドの説明:

FNR現在の入力ファイルに相対的なレコード数です。
NRレコードの総数です。

このFNR==NR { ... }構成は、最初の入力ファイルに対してのみ当てはまります。したがって、 の各行について、行values.txt全体 ( $0) を配列に追加します (私はこれを配列と呼びましたが、別の名前を付けることができます)。next次の行を強制的awkに読み込みますvalues.txt(コマンドの残りの処理をスキップします)。がFNR==NR真でなくなると、引数リストの 2 番目のファイルが読み取られます。次に、配列の 2 番目の列 ( ) をチェックし、$2そこにある場合は、それを出力して配列から削除します。を使用deleteすることで、基本的に最大カウントを 1 に設定します。

于 2012-11-03T00:58:33.067 に答える
0

これも機能します。

for i in $(cut -d " " -f1 somelog.log | sort -u); do LC_ALL=C fgrep -m1 "$i" somelog.log; done
于 2016-07-19T04:16:23.313 に答える
0

これを試して。grep のバージョンによっては動作しない場合があります。

 grep -m 1 -e pattern1 -e pattern2
于 2012-11-03T00:58:52.410 に答える
0

それぞれに使用できます(ディレクトリ内の各ファイルのLinuxシェルスクリプトを参照してくださいファイル名を取得してプログラムを実行します)一致させたいパターンごとに、出力ファイルに連結する個別のgrepを実行します

于 2012-11-03T01:01:02.830 に答える