• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

probleme mit awk

Hallo zusammen

hoffe hier bin ich richtig und es kann mir wer helfen.

also ich habe eine Datei1.txt (wurde von einem Programm erzeugt) mit einer Spalte und ca 1 Millionen Zeilen.

123456789
225487963
587423589
523849523
usw.

dieser Datei möchte ich eine weitere Spalte mit awk hinzufügen:

awk '{print $1 " Datei1" }' Datei1.txt >> Datei2.txt

das erwartete Ergebnis sollte dann so aussehen:

123456789 Datei1
225487963 Datei1
587423589 Datei1
523849523 Datei1
usw.

leider sieht das Ergebnis so aus:

Datei16789
Datei17963
Datei13589
Datei19523

was mache ich falsch? oder gibts versteckte Zeichen? mit anderen Dateien funktioniert es auch.

vielen dank

PS: ich arbeite mit RedHat und bin neu in dem Bereich.

gruß
Alana
 
Hm ... also bei mir macht die Zeile genau das, was du willst :roll:
(openSUSE 11.0)
Code:
admine@reni3:/daten/tmp> awk '{print $1 " Datei1" }' Datei1.txt >> Datei2.txt
admine@reni3:/daten/tmp> cat Datei2.txt
123456789 Datei1
225487963 Datei1
587423589 Datei1
523849523 Datei1
 
Hallo

danke für eure Antworten, aber es ist hier wie verhext. wenn ich $1 "Datei" angebe gehts nicht und wenn ich "Datei" $1 angebe gehts. ich hab das thema öfters aber irgendwann funzt es dann schon, nur diesmal nicht.. und jetzt wärs echt wichtig....*grumml* und ich brauche die spalte mit den Zahlen vorne, damit ich zwei dateien vergleichen kann ( mach das mit join).

Gruß
Alana
 

framp

Moderator
Teammitglied
Oder nimm perl:
Code:
perl -e 'while (<>) { chomp; print "$_ Datei1\n";}' datei.txt > result.txt
 
hallo framp

danke für den tipp. hättest du noch einen für mich? ich wollte mit awk alle Zeilen zwischen einer Range raussuchen und diese in eine neue datei speichern. nur das blöde ist, wenn die start/stop nummer nicht existert erkennt awk den range nicht an.

beispiel: ich habe eine vorgegebene range 123456780 - 123457000 gehört zu bereich A die Datei ist unique und sortiert. Start und stop bereich können existieren müssen aber nicht. (auch zwischendrinnen können Zahlen fehlen)

passt in den range
123456785 Datei1
123456786 Datei1
123456787 Datei1
123456788 Datei1
123456789 Datei1

passt nicht in den range
225487963 Datei1
587423589 Datei1
523849523 Datei1

Vielen dank

gruß
Alana
 
Code:
perl -e 'while (<>) {$begin = 123456780; $end = 123457000; @a = split(" ", $_); $b = $a[0]; if($b >= $begin && $b <= $end) { print $_; } }' datei.txt > result.txt
 

framp

Moderator
Teammitglied
Oder mit start und end als Aufrufparameter:
Code:
perl -e 'my $start = shift; my $end = shift; 
while (<>) {
   /(\w+)/;
   if ($1 >= $start && $1 <= $end ) {
      print;
   }
}' 10000 20000 datei.txt > result.txt
 
alana.the.witch schrieb:
awk '{print $1 " Datei1" }' Datei1.txt >> Datei2.txt

Perl ist natürlich schöner ;) aber das müsste doch auch mit awk gehen ...

Meine Versuche:
Code:
prompt> echo 123456789 | awk '{print $1 " Datei1" }'
123456789 Datei1
prompt> echo 123456789 | awk '{printf "%s Datei1\n", $1}'
123456789 Datei1
... funktionieren beide bei mir. Versuch doch bitte auch mal die Variante mit printf
 
framp schrieb:
Oder nimm perl:
Code:
perl -e 'while (<>) { chomp; print "$_ Datei1\n";}' datei.txt > result.txt
Kürzer is das! :D
Code:
perl -lpe '$_.=" Datei1"'
framp schrieb:
perl -e 'my $start = shift; my $end = shift;
while (<>) {
/(\w+)/;
if ($1 >= $start && $1 <= $end ) {
print;
}
}' 10000 20000 datei.txt > result.txt[/code]
Code:
perl -lne 'INIT{($s,$e)=@ARGV}/(\w+)/;print if$1>=$s&&$1<=$e'
:-D BTW, war vielleicht /^(\d+)/ gewollt?
 
Oben