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
perl
Rでこれを行う方法を知っていますが、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
上記の回答ほど「良くない」以前の回答です。
各行をawk
orで区切られたフィールドのリストとして使用して解釈すると、各行の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