Portál AbcLinuxu, 12. listopadu 2025 07:03


Dotaz: Bash práce s textovým souborem

17.4.2006 10:30 xg6
Bash práce s textovým souborem
Přečteno: 667×
Odpovědět | Admin
Umožňuje bash vypsat soubor následujícím způsobem:?
soubor.txt:
prvni 45 21 32
druhy 12 321 21


a bash mi vypíše: v prvním řádku: 1)prvni, 2)45, 3)21 4)32 ...atd
Mohl byste mě něko navést na nějakou stránku nebo tak něco. Přečetl jsem už poměrně dost stránek o bashi, ale jediné co umím je vypisovat to po částech takhle prvni pak 45 pak 21 pak32 pak druhy, ale nevim, jak zařídit, aby si to všímalo řádků.
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

17.4.2006 10:36 Michal Kubeček | skóre: 71 | Luštěnice
Rozbalit Rozbalit vše Re: Bash práce s textovým souborem
Odpovědět | | Sbalit | Link | Blokovat | Admin
V takto jednoduchém případě by stačilo v cyklu použít read, na složitější věci se pak hodí awk.
17.4.2006 17:02 xg6
Rozbalit Rozbalit vše Re: Bash práce s textovým souborem
No nenapadlo mě lepší řešení(krajně napraktické a pomalé), než data předávat perl skriptu, který poté odstraní konce řádků a dál už to zpracovává bash, ovšem řešení je to opravdu pomalé. Moje otázka tedy zní: jak v bashi nahrazovat znaky, konkrétně tedy jak odstranit konce řádků?
17.4.2006 17:10 Pavel1 | skóre: 33
Rozbalit Rozbalit vše Re: Bash práce s textovým souborem
man tr
man sed
17.4.2006 17:14 Pavel1 | skóre: 33
Rozbalit Rozbalit vše Re: Bash práce s textovým souborem
tady ještě kupa příkladů sedu
17.4.2006 17:45 xg6
Rozbalit Rozbalit vše Re: Bash práce s textovým souborem
dík
17.4.2006 19:35 xg6
Rozbalit Rozbalit vše Re: Bash práce s textovým souborem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Stejně je to nějaký divný:
source je nejaky soubor

for x in `grep -v ^# $source | awk '{print $1,$2,$3,$4,$5,$6}'`; do
echo x
done;

Jak udělat aby se mi vypsal soubor řádek po řádku, takhle se mi vypisuje slovo od slova ať dělám co dělám.
17.4.2006 20:15 neal_cz | skóre: 29
Rozbalit Rozbalit vše Re: Bash práce s textovým souborem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Nevím,jestli to chápu dobře, ale takhle nějak(?):

while read -r radek; do echo $radek; done < soubor.txt

Jestli je to ono, tak nějaký příklad najdete v man read
17.4.2006 20:46 xg6
Rozbalit Rozbalit vše Re: Bash práce s textovým souborem
No nevím jak by to udělal ten read, ale já jsem to udělal teď takhle, asi tak trošku hodně nestandartně ale funguje:
for x in `grep -v ^# $source | awk '{print $1"|"$2"|"$3"|"$4"|"$5"|"$6}'`; do

...
a pak ty | odstraním a roztřídím, protože kdybych do toho print dal mezeru, bralo by to jako další řádek
17.4.2006 21:14 neal_cz | skóre: 29
Rozbalit Rozbalit vše Re: Bash práce s textovým souborem
Ten read postupně načítá ze souboru jednotlivé řádky do proměnné $radek. Akorát pak nemusíte odstraňovat ty | :)
17.4.2006 23:17 xg6
Rozbalit Rozbalit vše Re: Bash práce s textovým souborem
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pro úplnost, tady je ten skript, ale stejně se mi zdá, že funguje docela pomalu na mým stroji Pentium 266Mhz:
#!/bin/sh

source=${3}

cisloz="10"
cislo="0"
cislo2="0"

for x in `grep -v ^# $source | awk '{print $1}'`; do
cislo2=`expr $cislo2 + 1`
done

TC=/sbin/tc
IPTABLES=/sbin/iptables

INET_IFACE=eth0
LAN_IFACE=eth1


$TC qdisc del dev $LAN_IFACE root
$TC qdisc add dev $LAN_IFACE root handle 1:0 htb
$TC class add dev $LAN_IFACE parent 1:0 classid 1:1 htb rate ${1}kbit ceil ${2}kbit burst 64k

$TC qdisc del dev $INET_IFACE root
$TC qdisc add dev $INET_IFACE root handle 2:0 htb
$TC class add dev $INET_IFACE parent 2:0 classid 2:1 htb rate ${1}kbit ceil ${2}kbit burst 64k

echo "Celkem rate a ceil na kartu: ${1}/${2}"
echo "Rozdeleni dle souboru: ${3}"
echo "IP adresa	Download	Upload"
for x in `grep -v ^# $source | awk '{print $1"|"$2"|"$3"|"$4"|"$5}'`; do

x=`echo $x | sed 's/|/ /g'`;
x1=`echo $x | awk '{print $1}'`
x2=`echo $x | awk '{print $2}'`
x3=`echo $x | awk '{print $3}'`
x4=`echo $x | awk '{print $4}'`
x5=`echo $x | awk '{print $5}'`

echo $x1"    "$x2/$x3"        "$x4/$x5

cislo=`expr $cislo + 1`
cislo2=`expr $cislo2 + 1`
cisloz=`expr $cisloz + 1`

$TC class add dev $LAN_IFACE parent 1:1 classid 1:$cisloz htb rate ${x2}kbit ceil ${x3}kbit burst 64k
$IPTABLES -t mangle -A FORWARD -i $INET_IFACE -d $x1 -j MARK --set-mark $cislo
$IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p all -d $x1 -j MARK --set-mark $cislo
$IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p tcp -d $x1 -j MARK --set-mark $cislo
$IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p udp -d $x1 -j MARK --set-mark $cislo
$IPTABLES -t mangle -A OUTPUT -o $INET_IFACE -p icmp -d $x1 -j MARK --set-mark $cislo
$TC filter add dev eth1 parent 1:0 protocol ip handle $cislo fw flowid 1:$cisloz

$TC class add dev $INET_IFACE parent 2:1 classid 2:$cisloz htb rate ${x4}kbit ceil ${x5}kbit burst 64k
$IPTABLES -t mangle -A FORWARD -i $LAN_IFACE -s $x1 -j MARK --set-mark $cislo2
$IPTABLES -t mangle -A INPUT -i $LAN_IFACE -p all -d $x1 -j MARK --set-mark $cislo2
$IPTABLES -t mangle -A INPUT -i $LAN_IFACE -p tcp -d $x1 -j MARK --set-mark $cislo2
$IPTABLES -t mangle -A INPUT -i $LAN_IFACE -p udp -d $x1 -j MARK --set-mark $cislo2
$IPTABLES -t mangle -A INPUT -i $LAN_IFACE -p icmp -d $x1 -j MARK --set-mark $cislo2
$TC filter add dev $INET_IFACE parent 2:0 protocol ip handle $cislo2 fw flowid 2:$cisloz

done
data se načítají ze souboru:
#IP		download	upload
192.168.1.2	16	512	64	512
192.168.1.3	256	1024	256	1024
192.168.1.5	256	1024	256	1024

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.