524 Stimmen

Wie man das letzte Feld mit 'cut' findet

Ohne Verwendung von sed oder awk, nur cut, wie bekomme ich das letzte Feld, wenn die Anzahl der Felder unbekannt oder bei jeder Zeile variiert?

10voto

A friend Punkte 109

Dies ist die einzige mögliche Lösung, um nichts als cut zu verwenden:

echo "s.t.r.i.n.g." | cut -d'.' -f2- [wiederholen_der_folgenden_teil_fuerimmer_oder_bis_der_speicher_ausgeht:] | cut -d'.' -f2-

Mit dieser Lösung kann die Anzahl der Felder tatsächlich unbekannt sein und sich von Zeit zu Zeit ändern. Da die Zeilenlänge jedoch LINE_MAX-Zeichen oder Felder, einschließlich des Zeilenumbruchszeichens, nicht überschreiten darf, kann eine beliebige Anzahl von Feldern als echte Bedingung dieser Lösung niemals Teil sein.

Ja, eine sehr alberne Lösung, aber die einzige, die meiner Meinung nach den Kriterien entspricht.

6voto

Maso Mahboob Punkte 61

Es ist besser, awk beim Arbeiten mit tabellarischen Daten zu verwenden. Wenn es mit awk erreicht werden kann, warum nicht das nutzen? Ich schlage vor, dass du nicht deine kostbare Zeit verschwendest und stattdessen eine Handvoll Befehle benutzt, um die Arbeit zu erledigen.

Beispiel:

# $NF bezieht sich auf die letzte Spalte in awk
ll | awk '{print $NF}'

3voto

jstine Punkte 3119

Wenn Ihr Eingabestring keine Schrägstriche enthält, können Sie basename und ein Subshell verwenden:

$ basename "$(echo 'maps.google.com' | tr '.' '/')"

Dies verwendet weder sed noch awk, verwendet jedoch auch nicht cut, daher bin ich mir nicht sicher, ob es als Antwort auf die Frage gilt, wie sie gestellt ist.

Dies funktioniert nicht gut, wenn Eingabestrings verarbeitet werden, die Schrägstriche enthalten können. Ein Workaround für diese Situation wäre, den Schrägstrich durch ein anderes Zeichen zu ersetzen, von dem Sie wissen, dass es nicht Bestandteil eines gültigen Eingabestrings ist. Zum Beispiel ist das Pipe-Zeichen (|) auch nicht in Dateinamen erlaubt, also würde dies funktionieren:

$ basename "$(echo 'maps.google.com/some/url/things' | tr '/' '|' | tr '.' '/')" | tr '|' '/'

3voto

moni905 Punkte 31

Ein Alternativvorschlag unter Verwendung von Perl wäre:

perl -pe 's/(.*) (.*)$/$2/' datei

wo Sie \t durch das Trennzeichen von datei ersetzen können

2voto

user2166700 Punkte 69

Das folgende implementiert den Vorschlag eines Freundes

#!/bin/bash
rcut(){

  nu="$( echo $1 | cut -d"$DELIM" -f 2-  )"
  if [ "$nu" != "$1" ]
  then
    rcut "$nu"
  else
    echo "$nu"
  fi
}

$ export DELIM=.
$ rcut a.b.c.d
d

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X