
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, awk
kann 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"
pattern
Auf 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 grep
und pcre
wird 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 100
in jeder Spalte und anschließender Textextraktion aus der 2. Spalte
$ grep -oP '\b100\s+\S+\s+\K\S+' ip.txt
name
age
yak
Übereinstimmung 100
in 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 , \b
um 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