各キーワードの文字列は、文字列整数である複数行のテキストファイル(file1
)を1行につき1キーワードとします。行の順序は固定されています。sedとawkを使用して先行ゼロのない整数を含むキーワードマッチング
$cat file1
foo1
foo2
foo4
foo10
は、さらに、その行上記のキーワードのいずれかとすることができるそのうちの一つ、いくつかの空白区切り単語を含む複数行のテキストファイル(file2
)を仮定する。すべての行には1つのキーワードしか含めることができず、そのキーワードは最後の単語を除いて行内のどこにでも置くことができます。キーワードがその行に存在する場合は、baz=()
という語も行内に存在します。行の順序は固定されていません。
$cat file2
foo1 bar baz=()
bar foo4 baz=()
foo10 qux baz=()
foo2 baz=()
file2
の行は、キーワードn個が含まれている場合、私はをキーワードn個用語baz=()
にfile1
に持って行番号を追加したいです。
for kw in $(cat file1); do
lineNumbr=$(cat file1 | awk '/'$kw'/{print NR; exit}')
sed -i "/$kw/ s/baz\=()/baz\=($lineNumbr)/" file2
done
:
$sought_commands file1 file2
foo1 bar baz=(1)
bar foo4 baz=(3)
foo10 qux baz=(4)
foo2 baz=(2)
は私がキーワード
foo10ため
foo1のマスク用語
baz=()
をキーワード欠陥を持っている、次のコードを思い付きました。
$cat file2
foo1 bar baz=(1)
bar foo4 baz=(3)
foo10 qux baz=(1) # ERROR!
foo2 baz=(2)
編集1:私は、キーワードは常に区切り文字としてfile2
に空白が続いているという状況を利用して考えられたが、その後AWK-コマンドは失敗します。へ
for kw in $(cat file1); do
kw_adj="$kw "
lineNumbr=$(cat file1 | awk '/'$kw_adj'/{print NR; exit}')
sed -i "/$kw_adj/ s/baz\=()/baz\=($lineNumbr)/" file2
done
awk: cmd. line:1: /foo1
awk: cmd. line:1:^unterminated regexp
awk: cmd. line:1: /foo2
awk: cmd. line:1:^unterminated regexp
awk: cmd. line:1: /foo4
awk: cmd. line:1:^unterminated regexp
awk: cmd. line:1: /foo10
awk: cmd. line:1:^unterminated regexp
(と:あなたはすでに、単純なカウントを使用して行番号を知ることができる場合も
、ループ内lineNumbr=$(...)
は 、愚かですsed')あなたはおそらく何か間違っている。 – karakfa