Bash:在少于n行的目录中查找文件
我有一个包含多个文件的目录:Bash:在少于n行的目录中查找文件,bash,Bash,我有一个包含多个文件的目录: 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行)
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:仅列出包含的行数少于其文件名状态的文件
我偶然发现了这一点,但是,我无法修改代码以满足我的需要
问题
如何列出文件名中行数少于某个数字的所有文件?如果行数超过给定数字,可以使用awk计算行数并打印文件名。使用Gnu Awk,您可以执行以下操作:
awk 'BEGINFILE { f=FILENAME; n=gsub(/^.*_/,"",f)*2 }
(FNR == n) { nextfile }
ENDFILE{ if (FNR < n) print FILENAME }' filename_*.txt
awk'beginfle{f=FILENAME;n=gsub(/^.*.\u/,“”,f)*2}
(FNR==n){nextfile}
ENDFILE{if(FNR
您可以使用以下脚本:
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
shopt-s extglob
对于*.txt中的f;做
n=“${f/@(*|-*)}”提取第一个数字
($(wc-l<“$f”)<2*$n)和&echo“$f”#列出行数小于2*$n的文件
完成
扩展的glob语法(
@(*|-*)
)如中所述。在此代码中,*.
删除所有文本,直到我们得到.
,然后-*
删除-
之后的所有文本这是否回答了您的问题?