我在Linux中有多个小文件(大约70,000个文件),我想在文件的每一行的末尾添加一个单词,然后将它们全部合并到一个文件中。
我正在使用这个脚本:
for fn in *.sms.txt
do
sed 's/$/'$fn'/' $fn >> sms.txt
rm -f $fn
done
有更快的方法吗?
答案 0 :(得分:6)
我试过这些文件:
for ((i=1;i<70000;++i)); do printf -v fn 'file%.5d.sms.txt' $i; echo -e "HAHA\nLOL\nBye" > "$fn"; done
我尝试了大约 4分钟(真实)处理的解决方案。您的解决方案的问题在于您在sed
上飞行了70000次!分叉很慢。
#!/bin/bash
filename="sms.txt"
# Create file "$filename" or empty it if it already existed
> "$filename"
# Start editing with ed, the standard text editor
ed -s "$filename" < <(
# Go into insert mode:
echo i
# Loop through files
for fn in *.sms.txt; do
# Loop through lines of file "$fn"
while read l; do
# Insert line "$l" with "$fn" appended to
echo "$l$fn"
done < "$fn"
done
# Tell ed to quit insert mode (.), to save (w) and quit (q)
echo -e ".\nwq"
)
这个解决方案花了大约 6秒。
不要忘记,ed
是标准的文本编辑器,不要忽略它!如果您喜欢ed
,您可能也会喜欢ex
!
干杯!
答案 1 :(得分:2)
几乎与gniourf_gniourf的解决方案相同,但没有ed:
for i in *.sms.txt
do
while read line
do
echo $line $i
done < $i
done >sms.txt
答案 2 :(得分:1)
这个perl脚本在每行末尾添加实际文件名。
#!/usr/bin/perl
use strict;
while(<>){
chomp;
print $_, $ARGV, "\n";
}
这样称呼:
scriptname *.sms.txt > sms.txt
由于只有一个进程而且没有涉及正则表达式处理,所以它应该非常快。
答案 3 :(得分:1)
什么,不爱awk
?
awk '{print $0" "FILENAME}' *.sms.txt >sms.txt
使用gawk
,在我的机器上的gniourf_gniourf的sample上花了 1-2秒(根据time
)。
mawk
比gawk
快约0.2秒。