2017-10-31 12 views
1

複数行のテキストファイルfile1を仮定します。一部の行にキーワード「keyw」が含まれているとします。ソースとターゲット内の位置に基づいてawkで文字列を置換

$ cat file1 
foo 
bar keyw 
baz 
keyw qux 
quux 

はさらにfile1のキーワード出現限り多くの文字列を含む単一行のテキストファイルfile2を想定しています。 file2の文字列は、単一の空白で区切られています。

$ cat file2 
string1 string2 

Iはそれぞれの位置に基づいてfile1のキーワードを含む行にfile2の各文字列を追加したいと思います:

  • file1の最初の行に追加file2の最初の文字列そのキーワードが含まれています。

  • file2の2番目の文字列には、キーワードが含まれているfile1の2行目に2番目の行が追加されています。 -codeあなたはこの交換を行うために使用するどのようなawkの

    $ awk ... file1 file2 
    foo 
    bar keyw string1 
    baz 
    keyw qux string2 
    quux 
    

    :ここ

  • など

が求められ出力されますか?

+2

何を試しましたか?あなたの以前のawkの質問のいくつかがこのトピックに役立つ興味深いコードにつながると確信しています! – fedorqui

+0

あなたの質問に25分以内に最高の可能な答えが得られ、より良い回答が掲載されるのを待つのではなく、それを受け入れることができたのは幸いです。 –

答えて

0

もし

はまた、単一の行のテキストファイルを想定し、前記のでawk

awk ' 
    FNR==NR{split($0,strarr);next} 
    /keyw/{$0 = $0 OFS strarr[++i]}1 
    ' file2 file1 

を使用して、上に示した/ P oを

所望与えますキーワードとして多くの 文字列を含むfile2 file1に出現する。 file2の文字列は、単一の空白で区切られた です。それはデフォルトFS、単一のスペースでレコードを分割するように

説明

  • split($0,strarr);は、使用され、レコードが/keyw/がregexpにマッチしたときに要素が配列だから、strarr

  • に保存されますfile1の配列要素を出力し、変数iをインクリメントして次の行/レコードに移動

  • +1は、現在の/レコード/行を印刷するデフォルト操作を実行します。print $0。 awkの動作を知るには、awk '1' infileが全てのレコード/行を出力しますが、awk '0' infileは何も表示しません。ゼロ以外の数値は,となり、デフォルトの動作がトリガされます。

試験結果:

$ cat file1 
foo 
bar keyw 
baz 
keyw qux 
quux 

$ cat file2 
string1 string2 

$ awk 'FNR==NR{split($0,strarr);next}/keyw/{$0 = $0 OFS strarr[++i]}1' file2 file1 
foo 
bar keyw string1 
baz 
keyw qux string2 
quux 
+1

優れた説明をありがとう。 –

0

Input_fileが上記のサンプルと同じ場合は、次のように試してみてください。

awk 'FNR==NR{for(i=1;i<=NF;i++){a[i]=$i}next} {print $0,$0 ~ /keyw/?a[++j]:""}' FIlE2 FIlE1 

出力は以下のようになります。

foo 
bar keyw string1 
baz 
keyw qux string2 
quux 

ここでも説明します。 1以下

awk ' 
FNR==NR{   ##Using FNR==NR condition which will be RUE when first Input_file is getting read. FNR and NR both represents number of lines, only difference between them is FNR value will be RESET on every next file is getting read and NR value will be keep on increasing till all the files are read. 
for(i=1;i<=NF;i++){##Starting a for loop which will run from i variable value 1 to till value of variable NF, where NF is out of the box variable whose value is the value of number of fields on a line. 
    a[i]=$i}   ##Creating an array named a whose index is variable i and its value is $i(specific fields value) 
    next    ##next will skip all further statements for current line(s). 
} 
{     ##These statements will be executed when 2nd Input_file is being read. 
    print $0,$0 ~ /keyw/?a[++j]:"" ##Printing the value of current line along with that checking of a line has string keyw in it then printing the value of array a whose index is value of j(whose value increments with 1 each time it comes here), else print NULL/nothing. 
} 
' FIlE2 FIlE1  ##mentioning the Input_file(s) here. 
0

これはあなたが必要とするすべてである:

awk 'FNR==NR{split($0,a);next} /keyw/{$0=$0 OFS a[++c]} 1' file2 file1 

それはどんなのawkで動作し、非の最後に空白を追加しませんターゲットライン。

関連する問題