web-dev-qa-db-ja.com

行の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ツールがより優れている場合は大したことはありません。

4
TuxForLife

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
6
jesse_b

Perl:

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

内容をファイルに戻すには:

Perl -i -pe ...
5
glenn jackman

[ Miller に慣れようとしているからといって、異機種混在の出力を取得するには、フープをジャンプする必要があります]

$ 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
steeldriver