提取超过 5 行的文件,并保持相同的文件名

提取超过 5 行的文件,并保持相同的文件名

我有多个文件,其中包含年度报告中的错误。每个文件名都有 .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'

相关内容