awk部分文字列の一致

awk部分文字列の一致

そのため、あるフィールドの文字列を部分的に一致させ、そのフィールドを別のファイル内の他のフィールドと一緒に使用しようとしました。

入力例 -

1.txtと入力してください。

example/world
example/forever

2.txtと入力してください

example123
example234

期待される出力.txt:

example123/world
example234/world
example123/forever
example234/forever

したがって、デフォルトではAWKを使用して-を使用してinput1.txtを2つのフィールドに分割します。

awk -F"/"

これは、最初の行が$ 1で、example$ 2があることを意味します。world

次に、input2.txtの$ 1を部分的に一致させ、input2.txtにその内容が含まれていることを確認し、一致を見つけてexampleinput1の$ 2と結合します。

答え1

awk -v file2="input2.txt" -F'/' '{
  while ((getline line < file2) > 0){
    if (line ~ "^"$1) print line FS $2
  }
  close(file2)
}' input1.txt

これは基本的にあなたが説明するものです。input1.txtすべての行のそれぞれについてのinput2.txt先頭を読み、比較します$1。一致するものがある場合、input2.txt行は区切り文字/とで印刷されます$2

答え2

部分文字列の一致がどのように機能するかは次のとおりです。

$ cat tst.awk
BEGIN { FS=OFS="/" }
NR==FNR {
    strings[$1]
    next
}
{
    for (string in strings) {
        if ( index(string,$1) ) {
            print string, $2
        }
    }
}

$ awk -f tst.awk input2.txt input1.txt
example234/world
example123/world
example234/forever
example123/forever

文字列の先頭でのみ一致させるには、index(...)に変更しますindex(...) == 1

答え3

awk提供されたサンプルファイルに基づく別の解決策:

$ cat demo.awk
BEGIN { FS="/"; while ((getline < "input2.txt" ) > 0 ) { s[i++] = $0 } }

{ for (i in s)
    if (s[i] ~ "^"$1) { print s[i] FS $2 }
    # alternative tests
    # if (index(s[i], $1)) { print s[i] FS $2 }
    # if (index(s[i], $1) == 1) { print s[i] FS $2 }
}

出力:

$ awk -f demo.awk input1.txt
example123/world
example234/world
example123/forever
example234/forever
$

関連情報