5줄이 넘는 파일을 추출하고 동일한 파일 이름을 유지합니다.

5줄이 넘는 파일을 추출하고 동일한 파일 이름을 유지합니다.

연례 보고서에 오류가 포함된 파일이 여러 개 있습니다. 모든 파일 이름에는 .mvt 확장자가 있습니다. 모든 파일에 오류가 있는 것은 아닙니다. 오류가 있거나 오류가 없을 때 파일에는 항상 헤더가 5줄씩 있다는 것을 발견했습니다. 모든 파일(300개 이상의 파일)을 볼 필요는 없습니다.

awk도움이 될지 궁금했는데 awk 'NR> 5' filename.mvt문제는 을 사용해야 한다는 것입니다 if else. 파일을 복사( cp명령을 사용하여)하여 이름이 동일하게 유지되도록 하고 파일에 5줄 이상이 포함되도록 해야 한다는 것입니다.

답변1

다음 명령은 이름이 .mvt5줄보다 길고 이름이 끝나는 현재 디렉터리 안이나 아래의 모든 일반 파일을 검색합니다. 각 파일에 대해 파일의 경로 이름을 출력합니다.

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'

관련 정보