我在一个文件夹中有数百个文本文件。我正在寻找一种将文本文件中的行数附加到相应文本文件开头的方法?任何想法,如何使用 Bash 对文件夹中的所有文件快速执行此操作?
问问题
297 次
3 回答
4
怎么样:
for file in *.txt; do
tmp=$(mktemp -dt "${file}")
< ${file} wc -l | cat - ${file} > ${tmp}
mv ${tmp} ${file}
done
或者,如果您想并行执行:
function AddLineCount {
tmp=$(mktemp -dt "$1")
< $1 wc -l | cat - $1 > ${tmp}
mv ${tmp} $1
}
# With a parallelism of 10
# Assuming your disk has the iops for it.
ls *.txt | xargs -P10 -I^ AddLineCount ^
更新
修改文件而不创建新文件。这依赖于 sed 的一些属性,这些属性不是 bash 内置的,并且有时会因版本而异。当前命令适用于我的 Mac
sed -i -e "1s/^/$( wc -l fileName | awk '{print $1}')\\
/" fileName
所以循环执行:
for file in *.txt; do
sed -i -e "1s/^/$(wc -l ${file} | awk '{print $1}')\\
/" ${file}
done
于 2013-10-26T01:28:03.497 回答
1
以下将通过适当替换 grep 来做到这一点,以确保您处理正确的文件。
for i in $(ls |grep ".txt") ; do c=$(wc -l < $i) ; sed -i '1s/^/$c\n /' $i ; done
/$c\n/ 是附加的内容,因此您可以执行 /LINECOUNT: $c\n/ ,但保留 \n 以便之前的第一行不会附加到第二行,而是移动到第二行。
于 2013-10-26T01:22:06.993 回答
0
您可以使用此处提供的解决方案 - 它适用于一个文件,但您可以将其放在循环中以获得所需的文件列表。
或者,您可以编写一个程序来完成该任务。
我建议您将结果输出到单独的文件夹中,并且在发生错误时不要首先覆盖原始文件,还要测试空文件或您无权访问的文件的方法。
于 2013-10-26T01:15:51.687 回答