在bash中为文本中的每一行添加前缀

Mic*_*ael 9 bash awk text

假设有一个文本文件,a.txt例如

aaa
bbb
ccc
ddd

我需要myprefix_在文件的每一行添加一个前缀(例如):

myprefix_aaa
myprefix_bbb
myprefix_ccc
myprefix_ddd

我可以这样做awk:

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

现在我想知道在shell中是否有另一种方法可以做到这一点.

fed*_*qui 16

sed:

$ sed 's/^/myprefix_/' a.txt
myprefix_aaa
myprefix_bbb
myprefix_ccc
myprefix_ddd
Run Code Online (Sandbox Code Playgroud)

这将替换每行开头^myprefix_.请注意,这^不会丢失,因此这允许将内容添加到每行的开头.

您可以通过以下方式awk缩短版本:

$ awk '$0="myprefix_"$0' a.txt
myprefix_aaa
myprefix_bbb
myprefix_ccc
myprefix_ddd
Run Code Online (Sandbox Code Playgroud)

或传递价值:

$ prefix="myprefix_"
$ awk -v prefix="$prefix" '$0=prefix$0' a.txt
myprefix_aaa
myprefix_bbb
myprefix_ccc
myprefix_ddd
Run Code Online (Sandbox Code Playgroud)

它也可以用nl:

$ nl -s "prefix_" a.txt | cut -c7-
prefix_aaa
prefix_bbb
prefix_ccc
prefix_ddd
Run Code Online (Sandbox Code Playgroud)

最后:正如John Zwinck解释的那样,你也可以这样做:

paste -d'' <(yes prefix_) a.txt | head -n $(wc -l a.txt)
Run Code Online (Sandbox Code Playgroud)

在OS X上:

paste -d '\0' <(yes prefix_) a.txt | head -n $(wc -l < a.txt)
Run Code Online (Sandbox Code Playgroud)


Joh*_*nck 15

纯粹的bash:

while read line
do
    echo "prefix_$line"
done < a.txt
Run Code Online (Sandbox Code Playgroud)


Håk*_*and 11

作为参考,有关的速度awk,sed以及bash解决这个问题:

生成800K输入文件bash:

line="12345678901234567890123456789012345678901234567890123456789012345678901234567890"
rm a.txt
for i in {1..10000} ; do
    echo $line >> a.txt
done
Run Code Online (Sandbox Code Playgroud)

然后考虑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
Run Code Online (Sandbox Code Playgroud)

这里bashtest

while read line
do
    echo "prefix_$line" >> b.txt
done < a.txt
Run Code Online (Sandbox Code Playgroud)

awktest 是:

awk '$0="myprefix_"$0' a.txt > b.txt
Run Code Online (Sandbox Code Playgroud)

sedtest是:

sed 's/^/myprefix_/' a.txt > b.txt
Run Code Online (Sandbox Code Playgroud)

我在我的机器上得到以下结果:

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
Run Code Online (Sandbox Code Playgroud)

似乎bash解决方案要慢得多..