参照する

参照する

私が使用した典型的なtsvファイルの抜粋

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

以下は、すべての tsv ファイルの 2 列目で lord (大文字と小文字を区別しない) を検索します。

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ここで、 bash 環境変数として渡したいのは:

$ 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

問題

大文字と小文字を区別せずにパターンの一致を行うにはどうすればよいでしょうか?

以下を試しましたが、うまくいきませんでした

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 

参照する

答え1

まず第一に、$2~IGNORECASE = 1;/lord/{print}それがあなたが考えているように動作するかどうかは疑問です。私の知る限り、それは1変数に値を割り当てIGNORECASE、 の値を$2結果(つまり)と比較し、結果が真であれば$2 ~ 1デフォルトで を出力し、次に大文字と小文字を区別せずにと比較します。$0$0/lord/また$0それが真実であれば出力します。

$2大文字と小文字を区別せずに比較したい場合は、

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

あるいは単に

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

変数の場合の同等のものは

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

は標準の awk 機能ではないことに注意してくださいIGNORECASE。私の知る限り、GNU awk ( ) のみがこれをサポートしています。移植性のために、またはを使用して、入力を特定の場合に取得gawkできます。touppertolower

答え2

に関してThe following searches for lord (case insensitively) in 2nd column of all tsv files: awk '$2~IGNORECASE = 1;/lord/{print}' *.tsv- いいえ、それはまったく行われません。$2 の正規表現を、常に true である 1 に IGNORECASE を割り当てた結果と比較し、現在の行を出力します。次に、行のどこかで正規表現に一致する文字列を検索し、見つかった場合は行を 2 回目に出力します。おそらく、説明したとおりの動作lordをするように意図していたのでしょう。awk 'BEGIN{IGNORECASE = 1} $2~/lord/' *.tsv

この文脈では「パターン」という言葉はあいまいなので使用しないでください。パターンを部分的な正規表現の一致として使用していますが、完全な単語の文字列一致が必要であるかのように説明しています。したがって、質問で「パターン」が出てくるすべての箇所で、文字列または正規表現、部分または完全、単語または行の 3 つすべてに置き換えてください。そうすれば、適切な解決策を見つけるお手伝いができます。パターンに一致するテキストを見つける方法詳細については。

あなたがしようとしていることに対して、考えられる解決策をいくつか示します。

部分文字列一致:

$ 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

完全な単語文字列一致:

$ 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

全行文字列一致:

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

部分的な正規表現の一致:

$ 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

完全な単語の正規表現一致:

$ 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

完全な行の正規表現の一致:

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

上記は、シェル変数にエスケープシーケンスが含まれていないこと、または含まれている場合はそれを展開することを前提としています。そうでない場合は、の代わりにENVIRON[]または を使用しARGV[]てシェル変数の値を awk に渡します-vawk スクリプトでシェル変数を使用する方法詳細については。

答え3

perl

ファイルの 2 番目のフィールドでパターンを検索します:

perl -F"\t" -lane '$F[1] =~ /(?i)lord/ and print' input.tsv
  • -F"\t"ファイルがtsvであるためです
  • $F[1]フィールドはゼロインデックスなので、レコードの 2 番目のファイルになります。
  • (?i)正規表現で大文字と小文字を区別しないオプションです
  • i大文字と小文字を区別しない場合は、次のように修飾子または修飾子を使用できます。
perl -F"\t" -lane '$F[1] =~ /lord/i and print' input.tsv

exportシェル変数にマッチする正規表現は次のようにして実行できる。

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

.tsvフォルダー内のすべてのファイルを検索する:

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

レコードを含むファイル名が必要な場合は、次のようにします。

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

答え4

使用する必要がない場合はawk表形式のデータを処理する専用のツールを使用することができます。ゴーCSV、これは簡単です。

あなたが提供してくれたデータのサンプルから始めて、いくつかの名前を作り、「Journey」を推測してみました。

入力.tsv

ID アルバム 追跡 ハッシュ
10 インターステラー メインテーマ拡張 UDVtMYqUAyw
11 翻訳元
12 ジュラシックパークの音楽と雰囲気 素晴らしいサウンドスケープと音楽 いいえ
13 ロード・オブ・ザ・リング シャイアの音 chLZQtCold8
14 ロード・オブ・ザ・リング シャイア:バッグエンドの夕日 uBmbI8dzc-M
  1. シェル変数を設定するpattern
  2. デリムTSVをCSVに変換する
  3. フィルター2列目に-私 大文字と小文字を区別しない --正規表現そのシェル変数の
  4. 斬首する一致する行だけを取得する
  5. TSV に戻す:
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

関連情報