2016-09-08 3 views
0

Ich habe zwei Dateien:Wählen Sie Zeilen in einer Datei basierend auf bestimmten Werten in der zweiten Datei (Linux)

ist „Total.txt“. Es hat zwei Spalten: die erste Spalte ist natürliche Zahlen (Indikator) von 1 bis 20, die zweite Spalte enthält Zufallszahlen.

1 321 
1 423 
1 2342 
1 7542 
2 789 
2 809 
2 5332 
2 6762 
2 8976 
3 42 
3 545 
... ... 
20 432 
20 758 

Der andere ist "index.txt". Es hat drei Säulen: (1.indicator, 2: niedriger Wert, 3: hohe Wert)

1 400 5000 
2 600 800 
11 300 4000 

ich ausgeben will die Zeilen von „Total.txt“ Datei mit dem ersten Spalte übereinstimmt mit der ersten Spalte " index.txt "Datei. Und gleichzeitig muss die zweite Spalte der Ausgabeergebnisse größer als (>) die zweite Spalte der "index.txt" und kleiner als (<) die dritte Spalte der "index.txt" sein.

Das erwartete Ergebnis ist wie folgt:

1 423 
1 2342 
2 809 
2 5332 
2 6762 
11 ... 
11 ... 

ich das versucht:

awk '$1==(awk 'print($1)' index.txt) && $2 > (awk 'print($2)' index.txt) && $1 < (awk 'print($2)' index.txt)' total.txt > result.txt 

Aber es failed!

Können Sie mir dabei helfen? Vielen Dank!

+0

Verwenden Sie den Befehl 'join'. – Barmar

+0

Das ist nicht, wie Sie Shell-Befehle aus dem Inneren von 'awk' ausführen. – Barmar

+0

Danke @Barmar. Eigentlich möchte ich wissen, wie man den Wert aus der zweiten Datei bekommt, sonst kann ich kompliziertere Fragen herausfinden. Ich habe die obigen Fragen bereits aktualisiert. Ich bin neu bei Linux, vielen Dank für Ihre Hilfe! – lightsnail

Antwort

1

Sie müssen beide Dateien in derselben lesen awk Skript. Speichern Sie die anderen Spalten in einem Array, wenn Sie index.txt lesen.

awk 'FNR == NR { low[$1] = $2; high[$1] = $3; next } 
    $2 > low[$1] && $2 < high[$1] { print }' index.txt total.txt 

FNR == NR ist das gemeinsame awk Idiom zu erkennen, wenn Sie die erste Datei sind zu verarbeiten.

+0

Danke! Ich brauche eine Weile, um das zu verstehen. Ich habe die 'FNR == NR' überprüft. Jetzt ist es mir klar. Nochmals vielen Dank @Barmar – lightsnail

+0

Sorry, Sie noch einmal zu stören. Ich erforsche heute etwas Neues. Ich ändere das Format der 'index.txt' und stelle fest, dass der ursprüngliche Code nicht richtig funktionieren kann, wenn die erste Spalte der verschiedenen Regionen gleich ist (mindestens eine Region, die den gleichen Indikator wie andere Regionen hat, fehlt Bitte beachten Sie das obige Beispiel. @ Barmar – lightsnail

+0

Da die Arrays "Indikator" als Index verwenden, kann für jeden Indikator nur ein Eintrag vorhanden sein. Sie benötigen ein zweidimensionales Array aus "Indikator" und "Region", aber "awk" hat keine mehrdimensionalen Arrays. – Barmar

0

Verwendung wie Barmar beitreten sagte:

# To join on the first columns 
join -11 -21 total.txt index.txt 

Und wenn die Dateien nicht dann in lexikalischer Reihenfolge nach der ersten Spalte sortiert:

join -11 -21 <(sort -k1,1 total.txt) <(sort -k1,1 index.txt) 
+0

Danke @fivententaylor. Aber es scheint, dass der 'Join' nur die identischen Join-Felder von zwei Dateien kombinieren kann. Was ist, wenn die Datei 'index.txt' andere Bedingungen enthält (z. B. die zweite Spalte in' total.txt' muss sich in einem bestimmten Bereich befinden), werde ich die Frage in der ursprünglichen Frage aktualisieren. – lightsnail

Verwandte Themen