[Megoldva] Egy string n-edik előfordulását megtalálni egy text fájlban

Sziasztok,

Van egy szöveges fájlom, amiben rekordok vannak. A feladat az lenne, hogy a 76000-edik rekordot meg kéne találni valahogy. Igy néz ki a fájl:

CME20R12MSCberBase.CallDataRecord.uMTSGSMPLMNCallDataRecord
{
...
}
CME20R12MSCberBase.CallDataRecord.uMTSGSMPLMNCallDataRecord
{
...
}
Ez folytatódik jó hosszan.
Az ideális megoldás az lenne, ha egy script képes lenne megszámozni valahogy ezeket a rekordokat:

1: CME20R12MSCberBase.CallDataRecord.uMTSGSMPLMNCallDataRecord
{
...
}
2: CME20R12MSCberBase.CallDataRecord.uMTSGSMPLMNCallDataRecord
{
...
}

Gyanitom, hogy sed vagy awk meg tudja ezt csinálni, de annyira még nincs gyakorlatom ezekhez, hogy meg is tudjam ezt irni egyedül.

Ha egy windowsos szövegszerkesztővel is végbe lehet ezt vinni, az a megoldás is jól jönne.

Előre is köszi, ha valaki tud ebben segiteni!

Update: dap mindkét megoldása tökéletes. Ezer köszönet! (Solaris 10 alatt syntax errort ad a szemét de Linux alatt jó)
kikuchiyo perles megoldása is működik. (Sol10 alatt is)

Köszi mindenkinek!

Hozzászólások

Vhogy így:

awk '{ if (/^CME20R12MSCberBase.CallDataRecord.uMTSGSMPLMNCallDataRecord$/) i += 1;
if (i == 76000) print }'

Vagy a számozás így:

awk '{ if (/CME20R12MSCberBase.CallDataRecord.uMTSGSMPLMNCallDataRecord/) { i += 1; print i": "$0 } else print }'

rengeteg féle képp meg lehet oldani, a konkrét felépítéstől függ

egy gyors "megoldás", vagy valami olyasmi:)
grep -nA1 "}" | grep -A123 151998

Általánosabb "megoldás" perlben:


#!/usr/bin/perl

use strict;
use warnings;

my @where;

die "Usage: [perl] getlinenumber.pl {filename} {number}\n" unless $#ARGV == 1;
open(my $fh, '<', $ARGV[0]) || die("Could not open file");

my $key = <$fh>;
$where[0] = 1;

while (<$fh>) {
	if ($key eq $_) {
		push @where, $.;
	}
}
close $fh;

if ($ARGV[1] > scalar @where) {
	print "Record #$ARGV[1] not found\n";
} else {
	print $where[$ARGV[1]-1], "\n";
}

Használata pl.


getlinenumber.pl file.txt 76000

Megkeresi neked, hogy hányadik sorban van a 76000. rekord, vagy ha nem találja, akkor azt írja ki.

gawk-ban meg lehet változtatni a rekordszeparátort, ha azt átírod újsor karakterről }-re, akkor egyszerű lesz pár dolog...

grep-pel megkeresed, csak azokat a sorokat írod ki, és csak 76000 találatot engedsz, és így az utolsó sorod lesz a megfelelő (-m, -n opciók). Esetleg, ha biztosra akarsz menni, mondjuk egy "sed -n" paranccsal megspékeled, hogy csak a 76000. sort írja ki...