スペースで区切られたテキストファイルが与えられたら、最初の列でパターンを見つけます。見つかった場合は、その行の最初の項目を保持し、残りの項目を削除します。
入力(モード=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;} ブロックは実行されません。 - 代わりに現在の行が削除され、プログラムが終了し、次の行が実行されます。パターンバッファ領域にロードされると、プログラムが再起動されます。