我有多个文件,其中包含年度报告中的错误。每个文件名都有 .mvt 扩展名。不一定每个文件都有错误。我发现,当出现错误或不出现错误时,文件中总是有标题,即 5 行。没有必要查看每个文件(超过 300 个文件)。
我想知道是否awk
有帮助awk 'NR> 5' filename.mvt
,但问题是我必须使用if
else
.我想复制(使用cp
命令)文件,因此名称保持不变,包含超过 5 行的文件。
答案1
以下命令将检测当前目录中或当前目录下名称以 结尾.mvt
且长度超过五行的所有常规文件。对于每个文件,它将输出文件的路径名。
find . -type f -name '*.mvt' -exec sh -c '
for pathname do
if [ "$( wc -l <"$pathname" )" -gt 5 ]; then
printf "%s\n" "$pathname"
fi
done' sh {} +
将每个文件复制到某个目录(目前还不清楚您要做什么)实际上想要处理这些文件),您可能需要执行以下操作:
mkdir -p possible-error-files || exit 1
find . -type f -name '*.mvt' -exec sh -c '
for pathname do
if [ "$( wc -l <"$pathname" )" -gt 5 ]; then
printf "%s\n" "$pathname"
cp "$pathname" possible-error-files
fi
done' sh {} +
在这两个命令中,我传递文件的内容来wc -l
计算行数。
作为替代方案,您可以awk
同时进行行数计数和路径名输出(修改上面的第二个命令):
mkdir -p possible-error-files || exit 1
find . -type f -name '*.mvt' -exec sh -c '
for pathname do
if awk "BEGIN { err=1 } FNR > 5 { print FILENAME; err=0; exit } END { exit err }" <"$pathname"
then
cp "$pathname" possible-error-files
fi
done' sh {} +
或者,使用 GNU awk
:
mkdir -p possible-error-files || exit 1
find . -type f -name '*.mvt' -exec awk '
FNR > 5 {
print FILENAME
system("cp \"" FILENAME "\" possible-error-files")
nextfile
}' {} +
答案2
这是另一个解决方案:
for mvt_file in *.mvt; do
if [ "$(awk 'END {if(NR > 5) print "yes"}' "$mvt_file")" == "yes" ]; then
cp "$mvt_file" "$mvt_file - copy"
fi
done
您还可以这样做:
for mvt_file in *.mvt; do
if [ "$(wc -l < "$mvt_file")" -gt 5 ]; then
cp "$mvt_file" "$mvt_file - copy"
fi
done
两者都应该可以正常工作。
答案3
我们可以使用下面的脚本来查找超过 5 行的文件
for i in filename1 filename2 filename3 file; do j=`awk '{print NR}' $i| sort -nr| sed -n '1p'`; if [[ $j > 5 ]]; then echo $i; fi; done| sed '1i below are filenames which having lines more than 5'