So wählen Sie die zweite Spalte nach dem gefundenen Muster aus. Das Muster lautet „100“

So wählen Sie die zweite Spalte nach dem gefundenen Muster aus. Das Muster lautet „100“

cat file_1:

height 100  3 name
gray   125  8 yellow
base   100  5 age
red    455  9 tea
level  100  7 yak

meine endgültige Datei sollte nur zweite Spalten haben, die das Muster „100“ enthalten

cat final_file:

name 
age
yak

Antwort1

Wie val0x00ff vorschlägt, awkkann dies abgedeckt werden

Dies würde überall in Feld 2 mit 100 übereinstimmen, beispielsweise würde „foo100bar“ übereinstimmen.

awk '$2 ~ 100 {print $NF}' file_1 >final_file

Dies würde nur mit der Zahl 100 in Feld 2 übereinstimmen.

awk '$2 == "100" { print $NF }' file_1 >final_file

Antwort2

Im Allgemeinen würde ich etwa folgenden Code verwenden:

#!/bin/bash
matching_column=2  
filename="def"
awk -v matching_col=${matching_column}\
    -v printing_col=$((matching_column+2))\
    '$matching_col ~ 100 {printf "%s\n", $printing_col}' "$filename"  

patternAuf diese Weise können Sie mithilfe der Variablen die Spalte auswählen, die mit übereinstimmen muss matching_col. Anschließend wird die auszudruckende Spalte als berechnet printing_col=matching_column+2. Anschließend können Sie mithilfe von den im Feld „printing_column“ angegebenen Wert ausdrucken $printing_col.

Antwort3

Bei grepund pcrewird Leerzeichen als Spaltentrennzeichen angenommen.

$ cat ip.txt 
height 100  3 name
gray   125  8 yellow
base   100  5 age
red    455  9 tea
level  100  7 yak

Übereinstimmung 100in jeder Spalte und anschließender Textextraktion aus der 2. Spalte

$ grep -oP '\b100\s+\S+\s+\K\S+' ip.txt 
name
age
yak

Übereinstimmung 100in der 2. Spalte und anschließender Textabruf in der 2. Spalte

$ grep -oP '^\S+\s+100\s+\S+\s+\K\S+' ip.txt 
name
age
yak

Beide verwenden positive Lookbehind - gekennzeichnet durch \K. Der erste verwendet , \bum Wortgrenzen zu markieren (um Übereinstimmungen wie zu vermeiden 1100)

Zum Befehl hinzufügen > final_file, um die Ausgabe zu speichern

Antwort4

Ich denke, Steves Awk-Lösung oben ist die beste, aber da wir gerade dabei sind, hier ist eine Variante mit sed

sed -n 's/.* 100 .* \([a-z].*$\)/\1/p' original_file > newfile

Was Sie dazu bringt ...

cat newfile 
name
age
yak

verwandte Informationen