最初の出現を除くすべての行を削除します

最初の出現を除くすべての行を削除します

スペースで区切られたテキスト ファイルが指定されている場合は、最初の列でパターンを検索します。見つかった場合は、最初の出現を保持し、他の行を削​​除します。

入力(パターン = 1234):

1234    1111    2222
5678    3333    4444
1234    5678    9012
5678    1234    5678
1234    9786    5432

期待される出力:

1234    1111    2222
5678    3333    4444
5678    1234    5678

答え1

したがって、最初のフィールドが指定された値ではないすべての行を印刷し、一致する最初の行を印刷する必要があります。

awk -vF="$1" '{ if ($1 != F) { print; } else {if (!seen) { print ; seen=1}}}'

seenawk 変数 (この場合は) の初期値は 0 であるという事実を利用します。

答え2

GNU sed を使用して、最初に一致する行を保持し、それ以降の一致する行をすべて削除します。

sed -e '/^1234/{x;/./!{x;h;b;};d}' file

説明:

/^1234/パターンバッファが^1234に一致する場合

x- パターン バッファとホールド バッファを交換します (最初の一致ではホールド バッファは空なので、パターン バッファは空になります)

/./!- パターン バッファは空になりましたか?

{x;h;b;}- 次に、パターンとホールド バッファーをスワップ (x) し (これにより、現在の行がパターン バッファーに戻されます)、パターン バッファーを古いバッファーにコピー (h) し、この行の実行の最後に分岐します (b) - つまり、次の行をロードして、sed コードを再度開始します。最後の (d) 削除は実行されません。

d- 最初の一致の後、ホールド バッファーには一致する行のコピーが含まれるため、上記の {x;h;b;} ブロックは実行されません。代わりに、現在の行が削除され、プログラムが終了し、次の行がパターン バッファーにロードされて、プログラムが再び開始されます。

関連情報