行のn番目の数字を調整する方法は?

行のn番目の数字を調整する方法は?

文書の内容:

RANDOM TEXT    num1=400    num2=15    RANDOM TEXT
RANDOM TEXT    num1=300    num2=10    RANDOM TEXT
RANDOM TEXT    num1=200    num2=5    RANDOM TEXT

次のように、各行の各num2に対して5を減算したいと思います。

RANDOM TEXT    num1=400    num2=10    RANDOM TEXT
RANDOM TEXT    num1=300    num2=5    RANDOM TEXT
RANDOM TEXT    num1=200    num2=0    RANDOM TEXT

純粋なbashが好まれますが、他のGNUツールがより良い作業をしている場合は大きな問題ではありません。

答え1

使用awk:

awk '{ for (i=1;i<=NF;i++) { if ($i ~ /num2=/) {sub(/num2=/, "", $i); $i="num2="$i-5; print} } }' file

次に、各行の各列を繰り返しながら、含まれている列を見つけますnum2=。列を見つけたら、次の操作を行います。

  1. num2=削除 -sub(/num2=/, "", $i)
  2. 列を次のようにオーバーライドしますnum2={oldnum-5}$i="num2="$i-5
  3. この行を印刷してください -print

答え2

真珠:

perl -pe 's/(?<=num2=)(\d+)/$1 - 5/e' file

コンテンツをファイルに保存するには:

perl -i -pe ...

答え3

[ただもう少し仲良くしようとしています。ミラー- 異機種出力を得るには少しジャンプが必要です。:

$ mlr --fs ' ' --repifs --ocsvlite --headerless-csv-output put '
    $num1 = "num1=".$num1; $num2 = "num2=".($num2-5)
' file
RANDOM TEXT num1=400 num2=10 RANDOM TEXT
RANDOM TEXT num1=300 num2=5 RANDOM TEXT
RANDOM TEXT num1=200 num2=0 RANDOM TEXT

入力が実際に一部の列にスペースを含めることができるTSVの場合

$ mlr --fs '\t' --ocsvlite --headerless-csv-output put '
    $num1 = "num1=".$num1; $num2 = "num2=".($num2-5)
' file
RANDOM TEXT num1=400    num2=10 RANDOM TEXT
RANDOM TEXT num1=300    num2=5  RANDOM TEXT
RANDOM TEXT num1=200    num2=0  RANDOM TEXT

答え4

ビーム使用:

vim +'g/^/exe "norm! 3Wf=5\<C-A>"' +wq file

最初+ディスカッション各行で一連の通常モード操作を実行して、数値を5倍に増やします。それ:globalコマンドはすべての行で実行されます。ただ使用:normal範囲 %norm使用しないと簡単になります。CTRLA数値を増やしますが、この制御文字を(簡単に)Vimに渡すためにコマンドを実行する文字列として書き込みます。:executeだから私たちは必要です:global

2番目の+パラメータは簡単です。文書を保存

任意のテキスト形式があまり規則的でない場合(または正規表現を好む場合)、次のものを使用できます。:substitute注文する:

vim +'%s/num2=\zs\d\+/\=submatch(0) + 5' +wq file

これはコマンドを使用して:substitute部品を次のものに交換します。Nnum2=N既存の価値しかも5つ。

関連情報