Ich möchte für jede Zeile einer Datei einen Wert berechnen, etwa so:
1 1441792,11534336
2 1048576,8388608
3 1441792,1153433
4 1966080,15728640
5 393216,3145728
6 2621440,20971520
7 2490368,19922944
Ich muss den zweiten Wert ( 11534336
, 8388608
, [...]) ermitteln, mit beispielsweise 3 multiplizieren und diesen Wert in einer neuen Datei speichern.
Antwort1
Sie können awk
auch verwenden
awk -F "," '{print $2*3}' src.dat > newfile
wo
src.dat
sind Ihre Quelldaten (Eingabe) und
newfile
die neue Datei (Ausgabe)?
-F ","
Verwenden Sie als Feldtrennzeichen das , ,
$2
um das zweite Feld zu übernehmen (was nach dem steht ,
).
Antwort2
Da es sich um Ganzzahlarithmetik handelt, können Sie dies wahrscheinlich direkt in der Shell tun - zum Beispiel inbash
while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file > newfile
Testen fürstdout
$ while IFS="$IFS," read n x y; do printf '%d\n' "$((3*y))"; done < file
34603008
25165824
3460299
47185920
9437184
62914560
59768832
Antwort3
dc
So sed
funktioniert 's :
#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
AUSGABE
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
Es istsehrschnell.
Sie können dasselbe ohne Rückverweise tun – falls es einen Unterschied macht – und zwar auf diese Weise:
sed 's/^/[/;s/[^,]*$/&,]P& 3*p/' <file | dc
Wenn Sie nicht alles auf einmal, sondern nur die Ergebnisse möchten, ist es noch einfacher:
sed 's/.*,//;s/$/ 3*p/' <file | dc
Und wenn Sie die Zeilen nummerieren möchten:
sed 's/.*,//;s/$/ 3*p/' <file | dc | nl