SEDの行番号リストを使用して特定の行に単語を追加する

SEDの行番号リストを使用して特定の行に単語を追加する

複数行を含むexample.txtファイルがあります。

Larry is funny!
Funny, I've no glue!
Look here!
Tom has no pants.
The underpants are in the drawer.
Pants are in the closet!

任意の4行のファイルでファイルを生成した後

sed -n '=' example.txt | shuf | head -3 > line_numbers.txt

line_numbers.txtの行番号に次のものが含まれているとします。

1
3
6

line_numbers.txtの各行にWORDという単語を追加してexample.txtを編集したいと思います。これには、「パンツ」(「アンダーパンツ」などの部分単語の代わりに)という完全な単語が含まれています。

どうすればいいですか?

example.txtがこのように見えるようにしたい

Larry is funny!
Funny, I've no glue!
Look here!
Tom has no pants.
The underpants are in the drawer.
Pants are in the closet!WORD

編集する:

完全な単語だけを見つけるには、source_wordを次のように書く必要があります\<source_word\>

他の考えられる例:

次の行を含む他のファイルがあります。

I love apples.
You hate pineapples.
Apple pie is delicious.
Why do you do not like eating an apple?
We prefer pears to apples.
How many apples do you want to eat?
I have to bake three apple pies for sunday.

3つのランダムな行番号を含むリストがあります。

6
2
4

--OK行に完全な単語が含まれている場合にのみ、各行の末尾に追加したいと思いますapples

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

I love apples.
You hate pineapples.
Apple pie is delicious.
Why do you do not like eating an apple?
We prefer pears to apples.
How many apples do you want to eat?--OK
I have to bake three apple pies for sunday.

答え1

私も方法があればいいのですが、個人的にはこの複雑な作業がはるかに簡単だとsed思います。awk

awk 'NR==FNR{a[$1]++; next} 
    { 
        s=tolower($0); 
        if(FNR in a && s~/pants/){$0=$0"WORD"}
    }1' line_numbers.txt examples.txt 
Larry is funny!
Funny, I've no glue!
Look here!
Tom has no pants.
The underpants are in the drawer.
Pants are in the closet!WORD

awkGNU(gawkLinuxシステムのデフォルト)がある場合は、次のようにしてファイルを適切に編集できます。

gawk -i inplace 'NR==FNR{a[$1]++; print; next} 
                { 
                    s=tolower($0); 
                    if(FNR in a && s~/pants/){$0=$0"WORD"}
                }1' line_numbers.txt examples.txt 

または、次の内容を失っても大丈夫なら、少し簡単ですline_numbers.txt

gawk -i inplace 'NR==FNR{a[$1]++; next} 
                { 
                    s=tolower($0); 
                    if(FNR in a && s~/pants/){$0=$0"WORD"}
                }1' line_numbers.txt examples.txt 

答え2

次のパイプラインは変更されたバージョンで、出力は編集さsedれたスクリプトを実行します。

sed -n '=' file | shuf -n 3 | sed 's,$, { /\\<pants\\>/ s/$/WORD/; },'

または等しく、

awk '{ printf "%d { /\\<pants\\>/ s/$/WORD/; }\n", NR }' file | shuf -n 3

たとえば、これは次のように生成できます。

6 { /\<pants\>/ s/$/WORD/; }
5 { /\<pants\>/ s/$/WORD/; }
1 { /\<pants\>/ s/$/WORD/; }

ランダムに選択された行でパターンが発生した場合、このスクリプトはパターンに一致する各行の末尾WORDに追加される代替項目を適用します。pants

実行するには、以下を使用して簡単にお読みくださいsed -f

sed -n '=' example.txt | shuf -n 3 | sed 's,$, { /\\<pants\\>/ s/$/WORD/; },' |
sed -i -f /dev/stdin example.txt

または私のベースのawkバリエーションを使用してください。

awk '{ printf "%d { /\\<pants\\>/ s/$/WORD/; }\n", NR }' example.txt | shuf -n 3 |
sed -i -f /dev/stdin example.txt

中間ファイルは必要ありません。

更新されたクエリを解決するには、次のようにpants置き換えます。applesWORD--OK

答え3

これは一行の内容です(少し長めですが!)。

テキストファイルが「tfile」で、インデックスファイルがifileであるとし、次のようにします。

awk 'BEGIN{i=0;p=0}{if(FNR==NR){a[i++]=$1} else {if(a[p]==FNR){p++;g="";if(index($0,"Pants")){g="WORD"};  print $0,g}else{print $0}}}' ifile tfile

あなたは得るでしょう:

Larry is funny! 
Funny, I've no glue!
Look here! 
Tom has no pants.
The underpants are in the drawer.
Pants are in the closet! WORD 

答え4

GNU sedを使用すると、行番号ファイルでsedコードを設定してデータファイルに適用できます。

sed -f - <<\eof line_numbers.txt |\
sed -f - example.txt
  1i /pants/I!b
  s/$/ba/
  $a b;:a;s/$/WORD/
eof

別の方法は、sedコマンドを行番号で表記することです。

sed -e 's:.*:&s/pants.*/\&WORD/I;t:' line_numbers.txt |
sed -f /dev/stdin example.txt

関連情報