列1で最後に表示される文字列を見つけて、列3の対応する値に置き換えるにはどうすればよいですか?

列1で最後に表示される文字列を見つけて、列3の対応する値に置き換えるにはどうすればよいですか?

私のファイルには3つの列があります。

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/'

ベストアンサー1

パイプのない純粋なsedソリューションtac

このような場合、行ごとのアプローチはsed役に立ちません。-zGNUのオプションのように、バッファ全体を一度に処理することをお勧めします(ポータブルな代替方法を見るにはsedlinuxとGNUを使用するようです)。sedこのQ&A)。

これで欲張りな性格を活用できます。他のすべての出現は食べられるので、.*パターンは.*apple1最後の出現を含むすべてと一致します。apple1.*

次に、次のフィールド(\s+列区切り文字、[0-9]+2番目の列、その他の列\s+、すべてのGNU拡張正規表現)を追加し、()それを置き換えて再利用できるようにします\1。次に、外部に3つの列を追加して置き換えると、()結果は次のようになります。

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

それはすべてです。

GNUを使用していないユーザーのsedための注意:ポータブルソリューションはあまり便利ではありません。

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

おすすめ記事