そのため、あるフィールドの文字列を部分的に一致させ、そのフィールドを別のファイル内の他のフィールドと一緒に使用しようとしました。
入力例 -
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にその内容が含まれていることを確認し、一致を見つけてexample
input1の$ 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
$