Portál AbcLinuxu, 10. května 2025 06:32
A:10 B:30 D:33druhy (b.txt) vypada takto:
1:3:8:2:5:19Cisla v druhem souboru reprezentuji toto: 1 = A 3 = B ... 5 = E 19 = suma(A-E) Ja bych potreboval soubor b.txt upravit podle prvniho souboru aby vypadal takto:
10:30:8:33:5:86tzn hodnoty pismen, ktere se nachazeji v souboru a.txt (tedy A,B,D) prenesu na urcenou pozici v souboru b.txt a ty hodnoty (napr C), ktere se v prvnim souboru nenachazeji, ty v druhem souboru ponecham. Nakonec jeste zbyva vypocitat novou sumu. Zacal jsem se ucit jazyk awk, ten je podle meho nazoru na tuto operaci idealni. Stale vsak nejak nemohu prijit na to, jak to cele provest. Perl ani python pouzit nechci. Budu rad za vsechny rady, dekuji.
#!/bin/sh cat a.txt | tr [A-F] [1-6] | sed 's|\([0-9]\):\([0-9]*\)|s:\1:\2:g|' > /tmp/tempfile.$$ SUM="`cat b.txt | sed -f /tmp/tempfile.$$`" POM="`echo $SUM | sed 's|:|\ +\ |' | sed 's|+[0-9]*$||'`" SUM="$SUM:`expr $POM`" echo "$SUM" > b.txt rm -f /tmp/tempfile.$$
A:10 B:30 D:33a b.txt
1:1:8:2:5:17vrati vas skript vysledek:
10:10:8:30:5:107:Spravny vysledek by ale mel podle mne byt
10:30:8:33:5:86Problem prave v tech substitucich ukladanych do toho docasneho souboru.
BEGIN { FS = ":"; cells = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; for (i = 0; i < length(cells); i++) values[i] = "nan"; } /^[A-Z][:][0-9]+$/ { ind = index(cells, $1) - 1; if (ind >= 0) values[ind] = $2; } /^([0-9]+[:]?)+$/ { result = ""; sum = 0; for (i = 0; i < NF - 1; i++) { if (match(values[i], /[0-9]+/) > 0) { result = result values[i] ":"; sum += values[i]; } else { result = result $(i + 1) ":"; sum += $(i + 1); } } result = result sum; print result; } ~A pak to spustit pomoci
awk -f vypocet.awk a.txt b.txt
.
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.