ファイルの内容:
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ツールがより優れている場合は大したことはありません。
awk
の使用:
_awk '{ for (i=1;i<=NF;i++) { if ($i ~ /num2=/) {sub(/num2=/, "", $i); $i="num2="$i-5; print} } }' file
_
これは、各行の各列をループして、_num2=
_を含む列を探します。その列が見つかると、次のようになります。
num2=
_-sub(/num2=/, "", $i)
num2={oldnum-5}
_-_$i="num2="$i-5
_として再定義しますprint
Perl:
Perl -pe 's/(?<=num2=)(\d+)/$1 - 5/e' file
内容をファイルに戻すには:
Perl -i -pe ...
[ 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