a.txt
たとえば、テキストファイルがあるとします
ああ bbb ccc ddd
myprefix_
ファイルのすべての行にプレフィックス (例: ) を追加する必要があります。
myprefix_aaa myprefix_bbb myprefix_ccc myprefix_ddd
私はそれを行うことができますawk
:
awk '{print "myprefix_" $0}' a.txt
今、シェルでそれを行う別の方法があるかどうか疑問に思います。
とsed
:
$ sed 's/^/myprefix_/' a.txt
myprefix_aaa
myprefix_bbb
myprefix_ccc
myprefix_ddd
これにより、 で始まるすべての行が置き換え^
られmyprefix_
ます。は失われないことに注意してください^
。これにより、各行の先頭にコンテンツを追加できます。
awk
のバージョンを次のように短くすることができます:
$ awk '$0="myprefix_"$0' a.txt
myprefix_aaa
myprefix_bbb
myprefix_ccc
myprefix_ddd
または値を渡す:
$ prefix="myprefix_"
$ awk -v prefix="$prefix" '$0=prefix$0' a.txt
myprefix_aaa
myprefix_bbb
myprefix_ccc
myprefix_ddd
次の方法でも実行できますnl
。
$ nl -s "prefix_" a.txt | cut -c7-
prefix_aaa
prefix_bbb
prefix_ccc
prefix_ddd
最後に: John Zwinck が説明しているように、次のこともできます。
paste -d'' <(yes prefix_) a.txt | head -n $(wc -l a.txt)
OS X の場合:
paste -d '\0' <(yes prefix_) a.txt | head -n $(wc -l < a.txt)
awk
参考までに、この質問に対する、sed
、およびbash
ソリューションの速度については、次のとおりです。
で 800K の入力ファイルを生成しますbash
。
line="12345678901234567890123456789012345678901234567890123456789012345678901234567890"
rm a.txt
for i in {1..10000} ; do
echo $line >> a.txt
done
次に、bashスクリプトを検討してくださいtimeIt
if [ -e b.txt ] ; then
rm b.txt
fi
echo "Bash:"
time bashtest
rm b.txt
echo
echo "Awk:"
time awktest
rm b.txt
echo
echo "Sed:"
time sedtest
どこbashtest
ですか
while read line
do
echo "prefix_$line" >> b.txt
done < a.txt
awktest
は:
awk '$0="myprefix_"$0' a.txt > b.txt
そしてsedtest
次のとおりです。
sed 's/^/myprefix_/' a.txt > b.txt
私のマシンでは次の結果が得られました。
Bash:
real 0m0.401s
user 0m0.340s
sys 0m0.048s
Awk:
real 0m0.009s
user 0m0.000s
sys 0m0.004s
Sed:
real 0m0.009s
user 0m0.000s
sys 0m0.004s
bash
解決策がはるかに遅いようです..