我有一个包含多个文件的目录:
filename_10-1.txt
filename_10-2.txt
...
filename_10-1000.txt
filename_20-1.txt
filename_20-2.txt
...
filename_20-1000.txt
...
filename_600-1000.txt
我想列出行数少于文件名第一个数字两倍的所有文件(例如filename_10-874
应该有20行(2 * 10行)而filename_40-684
应该有80行(2 * 40行)。
方法
第1步:我能够计算单个文件中的行数,例如:
wc -l filename_10-1.txt
第2步:找到所有文件中的行数
for i in $(find filename_* -type f);
do wc -l $i;
done
第3步:仅列出行数少于文件名状态的文件。
我偶然发现了这个post,但是我无法更改代码来满足自己的需求。
问题
如何列出所有行数少于文件名中的数字的文件?
答案 0 :(得分:2)
您可以使用以下脚本:
shopt -s extglob
for f in *.txt; do
n="${f//@(*_|-*)}" # extract first number
(( $(wc -l < "$f") < 2*$n )) && echo "$f" # list files with less lines than 2*$n
done
在this tutorial中解释了扩展的glob语法(@(*_|-*)
)。在此代码中,*_
删除所有文本,直到我们得到_
,然后-*
删除-
之后的所有文本。
答案 1 :(得分:0)
您可以使用awk来计算行数,并在文件名超过给定数目时打印文件名。使用Gnu Awk,您可以:
awk 'BEGINFILE { f=FILENAME; n=gsub(/^.*_/,"",f)*2 }
(FNR == n) { nextfile }
ENDFILE{ if (FNR < n) print FILENAME }' filename_*.txt