假设有一个文本文件a.txt
,例如
aaa bbb ccc ddd
我需要在文件的每一行添加一个前缀(例如myprefix_
):
myprefix_aaa myprefix_bbb myprefix_ccc myprefix_ddd
我可以使用awk
执行此操作:
awk '{print "myprefix_" $0}' a.txt
现在我想知道在shell中是否有另一种方法可以做到这一点。
答案 0 :(得分:16)
使用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 explains,你也可以这样做:
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)
答案 1 :(得分:14)
Pure bash:
while read line
do
echo "prefix_$line"
done < a.txt
答案 2 :(得分:11)
供参考,关于此问题的awk
,sed
和bash
解决方案的速度:
在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
解决方案要慢得多......
答案 3 :(得分:1)
您还可以使用xargs
实用程序:
cat file | xargs -d "\n" -L1 echo myprefix_
-d
选项用于允许输入行末尾有空格(与-L
规范有关)。