![参照する](https://rvso.com/image/192228/%E5%8F%82%E7%85%A7%E3%81%99%E3%82%8B.png)
私が使用した典型的な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
できます。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 の正規表現を、常に 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 に渡します-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
使用する必要がない場合はawk表形式のデータを処理する専用のツールを使用することができます。ゴーCSV、これは簡単です。
あなたが提供してくれたデータのサンプルから始めて、いくつかの名前を作り、「Journey」を推測してみました。
入力.tsv
ID | アルバム | 追跡 | ハッシュ |
---|---|---|---|
10 | インターステラー | メインテーマ拡張 | UDVtMYqUAyw |
11 | 旅 | 翻訳元 | |
12 | ジュラシックパークの音楽と雰囲気 | 素晴らしいサウンドスケープと音楽 | いいえ |
13 | ロード・オブ・ザ・リング | シャイアの音 | chLZQtCold8 |
14 | ロード・オブ・ザ・リング | シャイア:バッグエンドの夕日 | uBmbI8dzc-M |
- シェル変数を設定する
pattern
- デリムTSVをCSVに変換する
- フィルター2列目に-私 大文字と小文字を区別しない --正規表現そのシェル変数の
- 斬首する一致する行だけを取得する
- 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