各行の乗算

各行の乗算

次のようにファイルの各行の値を計算したいと思います。

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新しいファイルのデータ(出力)
-F ","はフィールド区切り文字として使用します。は,
$22番目のフィールドを取得するために使用されます(の後に何がありますか,

答え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

関連情報