刪除第一次出現之外的所有行

刪除第一次出現之外的所有行

給定一個以空格分隔的文字文件,在第一列中尋找模式。如果找到,保留第一個出現的行並刪除其他行:

輸入(模式 = 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- 第一個符合之後,保留緩衝區將包含 macthing 行的副本,因此上面的 {x;h;b;} 區塊將不會執行 - 相反,當前行被刪除,程式結束,載入下一行進入模式緩衝區,程式再次啟動。

相關內容