Я хотел бы вычислить значение для каждой строки файла, например:
1 1441792,11534336
2 1048576,8388608
3 1441792,1153433
4 1966080,15728640
5 393216,3145728
6 2621440,20971520
7 2490368,19922944
Мне нужно получить второе значение ( 11534336
, 8388608
, [...]) и умножить его, например, на 3, и сохранить это значение в новом файле.
решение1
awk
Вы также можете использовать
awk -F "," '{print $2*3}' src.dat > newfile
где
src.dat
находятся ваши исходные данные (входные)
newfile
новый файл один (выходной)
-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