Portál AbcLinuxu, 23. dubna 2024 12:24


Dotaz: Seřazení souboru dle pořadí ve druhém souboru

9.7.2014 12:46 cigi | skóre: 2
Seřazení souboru dle pořadí ve druhém souboru
Přečteno: 207×
Odpovědět | Admin
Ahoj,

potřeboval bych poradit, jak v shelovém (bash) skriptu spojit a seřadit 2 soubory. Ten hlavní obsahuje v prvním sloupci ID a k němu v řádku nějaké další informace, je seřazen dle ID. Druhý soubor potom obsahuje jen ID, případně ještě prioritu, dle které je soubor řazen (tedy buď obsahuje v prvním sloupci prioritu a ve druhém ID, nebo jen ID - je to jedno, mohu to použít jak chci).

Jde mi o to, že potřebuji vykonávat nějaké operace v pořadí dle vypočítané priority pro každou položku dle ID a k tomu jsou potřeba informace z hlavního souboru. Nechce se mi jet dle seznamu s prioritami a pro každou položku prohledávat soubor s podrobnostmi, raději bych to vše spojil dohromady.

Asi bude existovat nějaké řešení pomocí awk, ale zaprvé s ním moc neumím (a trochu se mi do toho teď nechce) a za druhé si říkám, zda to není příliš těžkotonážní, ideálně bych si představoval nějakou chytrou linuxovou utilitku, která to udělá rychle a jednoduše - něco jako paste. Existuje něco takového?

Předem děkuji,

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

Odpovědi

wamba avatar 9.7.2014 14:42 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Seřazení souboru dle pořadí ve druhém souboru
Odpovědět | | Sbalit | Link | Blokovat | Admin
Když neuvedete příklady těch dvou souborů a jak má vypadat výstup tak je těžká představa co přesně chcete. (Sloupce jsou oddělené čím, jak vypadají ty priority, co jsou nějaké operace atd.) Ale vyřešit to ve vhodném skriptovacím jazyce (Perl, Python, Ruby, AWK, ...) to bude pravděpodobně snadné.
This would have been so hard to fix when you don't know that there is in fact an easy fix.
9.7.2014 15:01 cigi | skóre: 2
Rozbalit Rozbalit vše Re: Seřazení souboru dle pořadí ve druhém souboru
Pravda, díky.

Soubor dle kterého se má řadit vypadá takto:
3
1
4
2
Soubor s daty takto:
1 1.2.3.4 prvni
2 2.3.4.5 druhy
3 3.4.5.6 treti
4 4.5.6.7 ctvrty
výsledek má vypadat takto:
3 3.4.5.6 treti
1 1.2.3.4 prvni
4 4.5.6.7 ctvrty
2 2.3.4.5 druhy
Soubory nemusí mít stejný počet řádků, řádky bez priorit přijdou nakonec, přebytečné priority se zahodí. Řádku je cca 2500, výrazný růst nebude. Sloupce odděleny mezerou.
wamba avatar 9.7.2014 16:48 wamba | skóre: 38 | blog: wamba
Rozbalit Rozbalit vše Re: Seřazení souboru dle pořadí ve druhém souboru
tak v Perlu třeba takhle
use 5.010;
use warnings;
use strict;
use File::Slurp qw( :std );
#use Data::Dumper;

my @razeni = read_file( 'radici_soubor.txt', chomp => 1 );
my %radici_hash;
@radici_hash{@razeni} = ( 1 .. @razeni );

#say Dumper( \%radici_hash );

my @data_na_serazeni = read_file('soubor_na_serazeni.txt');
my @serazena_data =
  map  { $_->[1] }
  sort { $a->[0] <=> $b->[0] }
  map  { [ $radici_hash{ ( split m/\s+/, $_, 2 )[0] } // @razeni + 1, $_ ] }
  @data_na_serazeni;

print @serazena_data;
1;

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.