![Verweisen](https://rvso.com/image/192228/Verweisen.png)
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
Lord
Nun 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 1
der Variablen einen Wert zu IGNORECASE
, vergleicht den Wert $2
mit 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 $0
verglichen.$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 IGNORECASE
es sich nicht um eine Standardfunktion von awk handelt. Soweit mir bekannt ist, gawk
wird sie nur von GNU awk () unterstützt. Sie können sie aus Portabilitätsgründen verwenden toupper
oder tolower
um 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 lord
irgendwo 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/' *.tsv
da 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
i
kann verwendet werden, um die Groß- und Kleinschreibung zu ignorieren, wie in
perl -F"\t" -lane '$F[1] =~ /lord/i and print' input.tsv
export
Der 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 .tsv
Dateien 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 |
- Setzen Sie die Shell-Variable
pattern
- delimum die TSV-Datei in CSV-Datei umzuwandeln
- Filterin Spalte 2 mit dem-ich Groß-/Kleinschreibung --regexdieser Shell-Variable
- enthauptenum nur die passenden Zeilen zu erhalten
- 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