最初の項目を除くすべての行を削除

最初の項目を除くすべての行を削除

スペースで区切られたテキストファイルが与えられたら、最初の列でパターンを見つけます。見つかった場合は、その行の最初の項目を保持し、残りの項目を削除します。

入力(モード=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;} ブロックは実行されません。 - 代わりに現在の行が削除され、プログラムが終了し、次の行が実行されます。パターンバッファ領域にロードされると、プログラムが再起動されます。

関連情報