
次のようにファイルの各行値を計算したいと思います。
1 1441792,11534336
2 1048576,8388608
3 1441792,1153433
4 1966080,15728640
5 393216,3145728
6 2621440,20971520
7 2490368,19922944
2番目の値(11534336
、、、8388608
[...])にたとえば3を掛け、その値を新しいファイルに保存する必要があります。
答え1
awk
また、使用することができます
awk -F "," '{print $2*3}' src.dat > newfile
src.dat
ソースデータ(入力)はどこにありますか?
newfile
新しいファイル1(出力)は、2番目のフィールドを取得するための
-F ","
フィールド区切り文字として使用されます,
$2
(次の内容,
)。
答え2
整数演算なので、シェルで直接実行できます。bash
while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file > newfile
テストstdout
$ while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file
34603008
25165824
3460299
47185920
9437184
62914560
59768832
答え3
これはdc
現在sed
進行中であり、現在進行中です。
#v#backref courtesy Stephane's comment#v#
sed 's/.*,\(.*\)/[&,]P\1 *3p/' <<-\DATA | dc
1 1441792,11534336
2 1048576,8388608
3 1441792,1153433
4 1966080,15728640
5 393216,3145728
6 2621440,20971520
7 2490368,19922944
DATA
出力
1 1441792,11534336,34603008
2 1048576,8388608,25165824
3 1441792,1153433,3460299
4 1966080,15728640,47185920
5 393216,3145728,9437184
6 2621440,20971520,62914560
7 2490368,19922944,59768832
それ非常に早く。
次のように、逆参照なしで同じことができます(違いがある場合)。
sed 's/^/[/;s/[^,]*$/&,]P& 3*p/' <file | dc
それらをすべて一緒にしたくないので、結果だけが欲しいなら、もっと簡単です:
sed 's/.*,//;s/$/ 3*p/' <file | dc
行に番号を付けるには:
sed 's/.*,//;s/$/ 3*p/' <file | dc | nl