Verweisen

Verweisen

Ein Ausschnitt einer typischen TSV-Datei, die ich verwendet habe

10  Interstellar    Main Theme Extended UDVtMYqUAyw
11  Journey XvG78AmBLc4
12  Jurassic Park Music & Ambience  Amazing Soundscapes and Music   PPl__iyIg6w
13  Lord of the Rings   Sound of The Shire  chLZQtCold8
14  Lord of the Rings   The Shire: Sunset at Bag End    uBmbI8dzc-M

Folgendes sucht in der 2. Spalte aller TSV-Dateien nach „Lord“ (ohne Berücksichtigung der Groß-/Kleinschreibung):

awk '$2~IGNORECASE = 1;/lord/{print}' *.tsv 

13      Lord of the Rings       Sound of The Shire      chLZQtCold8
14      Lord of the Rings       The Shire: Sunset at Bag End    uBmbI8dzc-M

LordNun wollte ich als Bash-Umgebungsvariable übergeben :

$ awk -v Pattern="Lord" '$2~Pattern{print}' *.tsv 
13      Lord of the Rings       Sound of The Shire      chLZQtCold8
14      Lord of the Rings       The Shire: Sunset at Bag End    uBmbI8dzc-M

Problem

Wie kann die Musterübereinstimmung ohne Berücksichtigung der Groß-/Kleinschreibung durchgeführt werden?

Ich habe Folgendes versucht, aber es funktioniert nicht

awk -v Pattern="lord" '$2~IGNORECASE = 1;Pattern{print}' *.tsv

awk -v Pattern="lord" 'IGNORECASE = 1;$2~Pattern{print}' *.tsv

awk -v Pattern="lord" 'BEGIN {IGNORECASE = 1}  {$2~Pattern{print}}' *.tsv 

awk -v Pattern="Lord" '{IGNORECASE = 1; $2~Pattern}' *.tsv 

Verweisen

Antwort1

Erstens bezweifle ich, dass das $2~IGNORECASE = 1;/lord/{print}so funktioniert, wie Sie denken - meines Wissens weist es 1der Variablen einen Wert zu IGNORECASE, vergleicht den Wert $2mit dem Ergebnis (also $2 ~ 1) und gibt standardmäßig aus, wenn das Ergebnis wahr ist; dann wird ohne Berücksichtigung der Groß-/Kleinschreibung mit und $0verglichen.$0/lord/Auchdruckt $0, wenn das zutrifft.

Wenn Sie beim Vergleichen die Groß- und Kleinschreibung außer Acht lassen möchten $2, können Sie

gawk 'BEGIN{IGNORECASE = 1} $2 ~ /lord/{print}` *.tsv

oder nur

gawk 'BEGIN{IGNORECASE = 1} $2 ~ /lord/` *.tsv

Das Äquivalent mit einer Variablen wäre

gawk -v Pattern="lord" 'BEGIN{IGNORECASE = 1} $2 ~ Pattern' *.tsv

Beachten Sie, dass IGNORECASEes sich nicht um eine Standardfunktion von awk handelt. Soweit mir bekannt ist, gawkwird sie nur von GNU awk () unterstützt. Sie können sie aus Portabilitätsgründen verwenden toupperoder tolowerum die Eingabe in einem bestimmten Fall zu erhalten.

Antwort2

Bezüglich The following searches for lord (case insensitively) in 2nd column of all tsv files: awk '$2~IGNORECASE = 1;/lord/{print}' *.tsv- nein, das tut es überhaupt nicht. Es führt einen Regexp-Vergleich für $2 mit dem Ergebnis der Zuweisung von IGNORECASE auf 1 durch, was immer wahr ist, und druckt daher die aktuelle Zeile. Es sucht dann nach einer Zeichenfolge, die lordirgendwo in der Zeile mit dem Regexp übereinstimmt, und druckt die Zeile ein zweites Mal, wenn es gefunden wird. Das wollten Sie wahrscheinlich tun, awk 'BEGIN{IGNORECASE = 1} $2~/lord/' *.tsvda dies das bewirken würde, was Sie beschreiben.

Verwenden Sie in diesem Zusammenhang nicht das Wort „Muster“, da es höchst mehrdeutig ist. Sie verwenden Muster als teilweise Übereinstimmung mit regulären Ausdrücken, beschreiben es aber so, als ob Sie eine Übereinstimmung mit einer ganzen Wortfolge wünschen. Ersetzen Sie also bitte „Muster“ überall in Ihrer Frage durch alle drei aus Zeichenfolge oder regulärem Ausdruck und teilweisem oder vollständigem und Wort oder Zeile, damit wir Ihnen helfen können, die richtige Lösung zu finden. Siehewie-finde-ich-den-text-der-einem-muster-entsprichtfür mehr Informationen.

Hier sind einige mögliche Lösungen für das, was Sie möglicherweise versuchen:

Teilweise Übereinstimmung der Zeichenfolge:

$ awk -v var="$var" -F'\t' 'index(tolower($2),tolower(var))' file.tsv
13  Lord of the Rings   Sound of The Shire  chLZQtCold8
14  Lord of the Rings   The Shire: Sunset at Bag End    uBmbI8dzc-M

Vollständige Übereinstimmung der Zeichenfolge:

$ awk -v var="$var" -F'\t' 'index(" "tolower($2)" ",tolower(var))' file.tsv
13  Lord of the Rings   Sound of The Shire  chLZQtCold8
14  Lord of the Rings   The Shire: Sunset at Bag End    uBmbI8dzc-M

Vollständige Zeichenfolgenübereinstimmung:

$ awk -v var="$var" -F'\t' 'tolower($2) == tolower(var)' file.tsv
$

Teilweise Übereinstimmung mit regulären Ausdrücken:

$ awk -v var="$var" -F'\t' 'tolower($2) ~ tolower(var)' file.tsv
13  Lord of the Rings   Sound of The Shire  chLZQtCold8
14  Lord of the Rings   The Shire: Sunset at Bag End    uBmbI8dzc-M

Vollständige Übereinstimmung mit regulären Ausdrücken:

$ awk -v var="$var" -F'\t' '(" "tolower($2)" ") ~ tolower(var)' file.tsv
13  Lord of the Rings   Sound of The Shire  chLZQtCold8
14  Lord of the Rings   The Shire: Sunset at Bag End    uBmbI8dzc-M

Vollständige Übereinstimmung mit regulären Ausdrücken:

$ awk -v var="$var" -F'\t' 'tolower($2) ~ ("^"tolower(var)"$")' file.tsv
$

Das Obige setzt voraus, dass Ihre Shell-Variable keine Escape-Sequenzen enthält oder dass Sie diese erweitern möchten, falls dies der Fall ist. Wenn dies nicht der Fall ist, verwenden Sie ENVIRON[]oder , ARGV[]um den Wert der Shell-Variable an awk zu übergeben, anstatt -v, siehewie-verwende-ich-shell-variablen-in-einem-awk-skriptfür Details.

Antwort3

Mit perl:

Suche nach einem Muster im zweiten Feld der Datei:

perl -F"\t" -lane '$F[1] =~ /(?i)lord/ and print' input.tsv
  • -F"\t"liegt daran, dass die Datei TSV ist
  • $F[1]ist die zweite Datensatzdatei, da die Felder nullindiziert sind.
  • (?i)ist eine Option zur Nichtbeachtung der Groß-/Kleinschreibung in regulären Ausdrücken
  • oder Modifikator ikann verwendet werden, um die Groß- und Kleinschreibung zu ignorieren, wie in
perl -F"\t" -lane '$F[1] =~ /lord/i and print' input.tsv

exportDer reguläre Ausdruck, der eine Shell-Variable abgleicht, kann wie folgt erfolgen:

export p=lord
perl -F"\t" -lane '$F[1] =~ /(?i)$ENV{p}/ and print' input.tsv
perl -F"\t" -lane '$F[1] =~ /$ENV{p}/i and print' input.tsv

Suche in allen .tsvDateien eines Ordners:

perl -F"\t" -lane '$F[1] =~ /$ENV{p}/i and print' *.tsv

Wenn Sie einen Dateinamen mit Datensätzen wünschen, dann wäre Folgendes ausreichend:

perl -F"\t" -lane '$F[1] =~ /$ENV{p}/i and print $ARGV. ":" .$_' *.tsv

Antwort4

Wenn Sie nicht verwenden müssenawkund können ein Tool verwenden, das auf die Verarbeitung tabellarischer Daten spezialisiert ist, wieGoCSV, das ist ein Kinderspiel.

Ausgehend von den von Ihnen bereitgestellten Daten habe ich mir einige Namen ausgedacht und bei „Reise“ geraten:

Eingabe.tsv

AUSWEIS Album Schiene Hash
10 Interstellar Hauptthema erweitert UDVtMYqUAyw
11 Reise XvG78AmBLc4
12 Musik und Ambiente zu „Jurassic Park“ Erstaunliche Klanglandschaften und Musik PPl__iyIg6w
13 Herr der Ringe Der Klang des Auenlandes chLZQtCold8
14 Herr der Ringe Das Auenland: Sonnenuntergang in Beutelsend uBmbI8dzc-M
  1. Setzen Sie die Shell-Variablepattern
  2. delimum die TSV-Datei in CSV-Datei umzuwandeln
  3. Filterin Spalte 2 mit dem-ich Groß-/Kleinschreibung --regexdieser Shell-Variable
  4. enthauptenum nur die passenden Zeilen zu erhalten
  5. zurück in TSV konvertieren:
pattern='lord'
gocsv delim -i "\t" input.tsv              \
| gocsv filter -c 2 -i --regex "$pattern"  \
| gocsv behead                             \
| gocsv tsv

13      Lord of the Rings       Sound of The Shire      chLZQtCold8
14      Lord of the Rings       The Shire: Sunset at Bag End    uBmbI8dzc-M

verwandte Informationen