Portál AbcLinuxu, 21. května 2024 02:32


Dotaz: seznam

1.8.2017 15:27 pedroch
seznam
Přečteno: 404×
Odpovědět | Admin
Dobrý den, potřeboval bych poradit jak nato.

Mám dva soubory, v jednom seznam materiálu, npř. šrouby (M3, M4, M5, ...atd). Ve druhém souboru délky (5mm, 10mm, 15mm, ...atd).

Dotaz zní jak přečíst první požku z prvního souboru a k ní přiřadit všechny položky z druhého souboru. Výsledek zapsat do souboru xxx a pokračovat načtením druhé položky z prvního souboru a opět k ní přiřadit všechny položky z druhého souboru. Výsledek přidat do souboru xxx. Tento cyklus opakovat dokud nedojdu na konec prvního soubor.

Díky za odpovědi.
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

Josef Kufner avatar 1.8.2017 16:14 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: seznam
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vyrob si v SQLite dvě tabulky, jednu naplň daty z jednoho souboru, druhou z druhého souboru. Pak proveď vhodný dotaz do nově vzniklé databáze (hint: požadovaná operace se jmenuje "left join"). Může to znít jako děsně složitá cesta, jak tohle řešit, ale dá ti to možnost si například snadno spočítat, kolik čeho máš a kolik to bude stát.

Pokud to je domácí úkol na bash, tak man join. (Pro praktické použití to může stačit, ale velmi brzy budeš řešit obdobný problém znovu. – SQL na tohle je stavěné mnohem lépe.)
Hello world ! Segmentation fault (core dumped)
1.8.2017 16:27 pedroch
Rozbalit Rozbalit vše Re: seznam
Díky za odpověď, ale tabulky jsou pro mne zatím španělská vesnice. Myslel jsem pomocí nějakého cyklu, while, for, nebo until, spočítal řádky a tu pomocí awk vypisovat.

ps: domácí úkol to není. 50+
1.8.2017 17:08 NN
Rozbalit Rozbalit vše Re: seznam
'man join' muzes pouzit i bez domaciho ukolu.. ;) Btw:
přečíst první požku z prvního souboru a k ní přiřadit všechny položky z druhého souboru
na zaklade jakeho kriteria?
1.8.2017 17:15 pedroch
Rozbalit Rozbalit vše Re: seznam
Myslel jsem to asi tak, že na výstupu bude

M5 5mm M5 10mm M5 15mm M5 20mm M6 5mm M6 10mm M6 15mm M6 20mm M8 5mm M8 10mm M8 15mm M8 20mm

adt..
1.8.2017 17:26 MadCatX
Rozbalit Rozbalit vše Re: seznam
Toto?
#! /bin/bash

declare -a b_data

ctr=0
while read -r line || [[ -n "$line" ]]; do
	b_data[ctr]="$line"
	ctr=$ctr+1
done < "$2"

while read -r line || [[ -n "$line" ]]; do
	echo -n "$line "

	for i in "${b_data[@]}"; do
		echo -n "$i "
	done
	echo ""
done < "$1"
1.8.2017 17:58 pedroch
Rozbalit Rozbalit vše Re: seznam
Velice děkuji po meší úpravě to funguje supr. ;)

2.8.2017 18:00 Andrej | skóre: 51 | blog: Republic of Mordor
Rozbalit Rozbalit vše Re: seznam
b_data[${#b_data[@]}]="$line"

Takhle to jde bez proměnné s indexem.

Josef Kufner avatar 1.8.2017 17:28 Josef Kufner | skóre: 70
Rozbalit Rozbalit vše Re: seznam
SQLite: Viz článek na rootu.

Napsat si ten algoritmus na spočítání všech kombinací není nijak těžké, ale pokud bys chtěl ho pak rozširovat o další podmínky a počítat něco nad výsledkem, už to nebude úplně pohodlné.

V bashi pro několik málo hodnot:
for z in M3 M4 M5 M{7..20}
do
    for l in 5mm 10mm 15mm 20mm 30mm
    do
        echo $z $l
    done
done
Hello world ! Segmentation fault (core dumped)
wamba avatar 1.8.2017 19:15 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: seznam
Odpovědět | | Sbalit | Link | Blokovat | Admin
pomocí Perlu 6 třeba takhle (pokud jsou položky odděleny novým řádkem)
perl6 -e '.put for lines("srouby.txt".IO) X lines("delky.txt".IO)'
This would have been so hard to fix when you don't know that there is in fact an easy fix.

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.