スペースで区切られたテキスト ファイルが指定されている場合は、最初の列でパターンを検索します。見つかった場合は、最初の出現を保持し、他の行を削除します。
入力(パターン = 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}}}'
seen
awk 変数 (この場合は) の初期値は 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;} ブロックは実行されません。代わりに、現在の行が削除され、プログラムが終了し、次の行がパターン バッファーにロードされて、プログラムが再び開始されます。