행의 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.

두 번째 + 매개변수는 간단합니다.문서 저장.

임의의 텍스트 형식이 덜 규칙적인 경우(또는 정규식을 선호하는 경우) 다음을 사용할 수 있습니다.:substitute주문하다:

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

이는 명령을 사용하여 :substitute부품을 다음으로 교체합니다.Nnum2=N기존 가치게다가 5개.

관련 정보