複数行を含む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
awk
GNU(gawk
Linuxシステムのデフォルト)がある場合は、次のようにしてファイルを適切に編集できます。
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
置き換えます。apples
WORD
--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