Perl이나 awk를 사용하여 파일의 숫자에 대해 수학 연산을 어떻게 수행할 수 있나요?

Perl이나 awk를 사용하여 파일의 숫자에 대해 수학 연산을 어떻게 수행할 수 있나요?

A.txt 파일이 있습니다.

RS0255_RS0083:115,124,129,141,143,168,170,180
RS0343_RS0083:112,113,163,175,181
RS0343_RS0255:94,101,107,164,179,183

다음 숫자에 대해 수학 연산을 수행하고 싶습니다. 예를 들어 각 숫자에 10을 더하고 싶습니다. 출력:

RS0255_RS0083:125,134,139,151,153,178,180,190
RS0343_RS0083:122,123,173,185,191
RS0343_RS0255:104,111,117,174,189,193

perlR에서 이 작업을 수행하는 방법을 알고 있지만 R의 파일에 있는 숫자에 대한 수학을 어떻게 수행합니까 awk?

답변1

실제로 텍스트 파일에 대해 다양한 작업을 수행하는 데 사용할 수 있는 도구가 수십 개 있습니다. 당신이 언급한 특정한 경우에는 아마도 Perl을 사용할 것입니다.

$ perl -pe 's/\b(\d+)\b/$1 + 10/ge' fileA.txt 
RS0255_RS0083:125,134,139,151,153,178,180,190
RS0343_RS0083:122,123,173,185,191
RS0343_RS0255:104,111,117,174,189,193

답변2

gawk '$0+0 == $0 {$0 += 10} {ORS = RT} 1' RS='[:,\n]' file

답변3

답변 awk: 각 행을 두 개의 :분리된 필드로 구문 분석합니다. 두 번째 필드를 사용하여 split()쉼표로 구분된 필드로 분할하고 루프에서 분할 필드를 수정하여 새 출력 레코드를 생성합니다. 그런 다음 쉼표를 구분 기호로 사용하고 원래 첫 번째 필드를 "접두사"로 사용하여 새 레코드를 출력합니다.

awk -F : '
    BEGIN { OFS = "," }
    {
        prefix = $1
        nf = split($2,a,",")
        $0 = ""

        for (i = 1; i <= nf; ++i)
            $i = a[i] + 10

        printf "%s:%s\n", prefix, $0
    }' fileA.txt

출력은 다음과 같습니다

RS0255_RS0083:125,134,139,151,153,178,180,190
RS0343_RS0083:122,123,173,185,191
RS0343_RS0255:104,111,117,174,189,193

위 코드를 보다 간결하게 표현하면 다음과 같습니다(한 줄이 "더 낫다"고 생각하는 사람들을 위한).

awk -F: '{p=$1;n=split($2,a,",");$0="";for(i=1;i<n;++i)$i=a[i]+10;printf "%s:%s\n",p,$0}' OFS=, fileA.txt

위의 답변만큼 "좋지" 않은 이전 답변입니다.

각 줄을 awkor로 구분된 필드 목록으로 사용하고 해석하면 각 줄의 두 번째 필드에 10을 추가합니다.:,

awk -F '[:,]' 'BEGIN { OFS="," } { for (i = 2; i <= NF; ++i) $i += 10 }; 1' fileA.txt

이것이 당신에게 줄 것입니다

RS0255_RS0083,125,134,139,151,153,178,180,190
RS0343_RS0083,122,123,173,185,191
RS0343_RS0255,104,111,117,174,189,193

각 줄의 첫 번째 쉼표를 다시 a로 변경하려면 :다음을 사용하세요 sed 's/,/:/'.

awk -F '[:,]' 'BEGIN { OFS="," } { for (i = 2; i <= NF; ++i) $i += 10 }; 1' fileA.txt |
sed 's/,/:/'

답변4

나는 이것을 제안합니다 awk:

$ awk -F':|,' 'BEGIN { OFS="" } 
    $1 = $1":" { 
      OFS=""; 
      for(i=2; i<=NF; i++) { 
        $i = $i + 10; 
        if ( i != NF ) { 
          $i = $i"," 
        } 
      }; 
    }1' file
RS0255_RS0083:125,134,139,151,153,178,180,190
RS0343_RS0083:122,123,173,185,191
RS0343_RS0255:104,111,117,174,189,193


관련 정보