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