13

a.txtたとえば、テキストファイルがあるとします

ああ
bbb
ccc
ddd

myprefix_ファイルのすべての行にプレフィックス (例: ) を追加する必要があります。

myprefix_aaa
myprefix_bbb
myprefix_ccc
myprefix_ddd

私はそれを行うことができますawk

awk '{print "myprefix_" $0}' a.txt

今、シェルでそれを行う別の方法があるかどうか疑問に思います。

4

4 に答える 4

23

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)
于 2013-11-07T09:11:07.700 に答える
12

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解決策がはるかに遅いようです..

于 2013-11-07T12:32:25.703 に答える