引用する

引用する

私が使用した一般的な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番目の列でlorを検索します(大文字と小文字を区別しません)。

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これでb​​ash環境変数に渡したいと思います。

$ 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

まず、あなたが思うように動作するかどうか疑われます。 AFAIKは$2~IGNORECASE = 1;/lord/{print}値を結果(たとえば)と比較し、結果がtrueの場合はデフォルトで印刷します。そして比較1IGNORECASE$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

これはIGNORECASE標準のawk機能ではないことに注意してください。私が知っている限り、GNU awk(gawk)だけがそれをサポートしています。移植性のために、特定のケースへの入力を使用またはインポートtoupperできます。tolower

答え2

The following searches for lord (case insensitively) in 2nd column of all tsv files: awk '$2~IGNORECASE = 1;/lord/{print}' *.tsv- いいえ、まったくそうではありません。 $ 2の正規表現比較を実行し、IGNORECASEを値1と比較して、この結果は常にtrueなので、現在の行を印刷します。次に、lord正規表現に一致する行のすべての文字列を検索し、見つかった場合はその行を再印刷します。awk 'BEGIN{IGNORECASE = 1} $2~/lord/' *.tsvそうすれば、説明する効果を得ることができるので、おそらくこのようにしようとします。

この文脈では意味が非常にあいまいなので、「モード」という言葉を使用しないでください。 Pattern を部分正規表現マッチングとして使用しますが、完全な単語文字列マッチングを望むように説明します。したがって、正しい解決策を見つけるのに役立つように、「パターン」を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に渡すために使用-vします。awkスクリプトでシェル変数を使用する方法もっと学ぶ。

答え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

使用する必要がない場合アッそして、表形式のデータ操作用に設計されたツールを使用できます。GoCSV、これはスナップショットです。

ご提供いただいたデータサンプルをはじめ、いくつかの名前を作成し、「旅行」を推測しました。

入力.tsv

ID アルバム ハッシュ値
10 インターステラ テーマ拡張 UDVtMYqUAyw
11 旅行する XvG78AmBLc4
12 ジュラ紀公園の音楽と雰囲気 素晴らしいサウンドスケープと音楽 PPl__iyIg6w
13 リングの帝王 シャイヤーの声 chLZQtCold8
14 リングの帝王 シャイア: バックエンドの夕日 uBmbI8dzc-M
  1. シェル変数の設定pattern
  2. DelimTSVを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

関連情報