Linux

如何查找第 1 列中最後一次出現的字元串並替換第 3 列中的相應值?

  • August 1, 2019

我在一個文件中有三列:

apple1        10109283      20012983
apple1        10983102      10293809
apple1        10293893      2349823049
apple10       109283019     109238901
apple10       192879234     234082034
apple10       234908443     3450983490

我想在第 1 列(在本例中為第 3 行或第 6 行)中找到字元串的最後一次出現,並將第 3 列中的相應數字替換為不同的數字。範例(將第 3 行第 3 列替換為 444444444"

apple1        10109283      20012983
apple1        10983102      10293809
apple1        10293893      444444444
apple10       109283019     109238901
apple10       192879234     234082034
apple10       234908443     3450983490

到目前為止,我嘗試使用 sed 但它沒有用:

sed '$s/apple1*$/444444444/'

sed無管道的純溶液和tac

對於這樣的情況,逐行方法sed無濟於事。更好地一次處理整個緩衝區,就像-zGNU 的選項sed一樣(您似乎正在使用 linux 和 GNU sed,對於攜帶式替代品,請參閱此 Q&A)。

現在您可以利用 的貪婪本性.*:該模式.*apple1將匹配所有內容,包括最後一次出現的apple1,因為所有其他出現都被.*.

然後只需添加下一個欄位(\s+用於列分隔符,[0-9]+用於第二列和另一個\s+,所有 GNU 擴展正則表達式)並將其包圍,()以便您可以在替換中重用它作為\1. 然後在外部添加第三列()以將其替換為

sed -zE 's/(.*\napple1\s+[0-9]+\s+)[0-9]+/\14444444/'

就是這樣。

**非 GNUsed使用者的注意事項:**攜帶式解決方案不太方便:

sed -E 'H;1h;$!d;x;s/(.*\napple1[[:space:]]+[0-9]+[[:space:]]+)[0-9]+/\14444444/'

引用自:https://unix.stackexchange.com/questions/533214