給定一個以空格分隔的文字文件,在第一列中尋找模式。如果找到,保留第一個出現的行並刪除其他行:
輸入(模式 = 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;} 區塊將不會執行 - 相反,當前行被刪除,程式結束,載入下一行進入模式緩衝區,程式再次啟動。