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:各行を2つの別々:のフィールドに解析します。 2番目のフィールドを使用して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

上記のコードをより簡潔に表現すると、次のようになります(1行が「より良い」と思う人のため)。

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で区切られたフィールドのリストとして使用して解釈すると、各行の2番目のフィールドに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


関連情報