我在一个文件夹中有数百个文本文件。我正在寻找一种方法将文本文件中的行数附加到相应的文本文件的开头?任何想法,如何使用Bash快速为文件夹中的所有文件执行此操作?
答案 0 :(得分: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
答案 1 :(得分:1)
以下将使用appp替换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以使前一行不会附加到第二行但移到第二行。
答案 2 :(得分:0)
您可以使用此处提供的解决方案 - 它适用于一个文件,但您可以将其放在循环中以获取所需的文件列表。
或者,您可以编写一个程序来完成任务。
我建议您将结果输出到单独的文件夹,并且在发生错误时不首先覆盖原始文件,也测试空文件或无法访问权限的文件的方法。