입력 파일이 비어 있으면 nawk 조각을 우회합니다.

입력 파일이 비어 있으면 nawk 조각을 우회합니다.

여러 출력 파일을 생성하고 런타임에 이러한 출력 파일을 사용하는 스크립트가 있습니다.

다음은 스크립트에 의해 생성된 일부 파일입니다: apple.txt, section_fruit_out.csv, section_fruit_out_lookup.csv, food_lookup.csv, section_fruit_lookup.csv.

다음과 같은 코드 문구가 있습니다.

nawk 'FNR == NR && NF!=0 {x[$1] = $1; next;} {FS=OFS=","} FNR>1{if ($2 in x) {($6 = "apple")} } 1' apple.txt section_fruit_out.csv > section_fruit_out_lookup.csv 
nawk 'BEGIN { FS = OFS = ","; } FNR == NR { x[$1] = $2; next; } { if ($7 in x && $6 == "") { $6 = x[$7]; } else if ($6 == "" && $7 != "") { $6 = "TO_BE_DEFINED" } } 1' food_lookup.csv section_fruit_out_lookup.csv  > section_fruit_lookup.csv

이 코드 구문은 주로 예상되는 작업을 처리합니다. 그러나 apple.txt파일이 비어 있으면(파일이 데이터베이스 쿼리에 의해 생성됨) 스크립트가 예상대로 작동하지 않습니다. 파일이 비어 있으면 apple.txt첫 번째 부분( )의 출력 파일도 비어 있게 생성됩니다. 빌드가 비어 있고 두 번째 명령에서 사용되므로 두 번째 명령도 빈 출력 파일( )을 생성합니다.section_fruit_out_lookup.csvnawksection_fruit_out_lookup.csvnawknawksection_fruit_lookup.csv

nawk파일이 비어 있는 경우 첫 번째 명령을 무시 apple.txt하고 두 번째 nawk명령 section_fruit_out.csv에서 파일을 사용하도록 하려면 어떻게 해야 합니까 section_fruit_out_lookup.csv?

답변1

NR == FNR첫 번째 파일이 처리되고 있는지 테스트하는 대신 다음을 수행할 수 있습니다.

awk 'FILENAME == ARGV[1] {...} ...' file1 file2

하지만 이는 비용이 더 많이 드는 테스트이므로 file1일반 파일인 경우 다음을 사용하는 것이 좋습니다.@Archemar의 방법awk첫 번째 파일이 비어 있으면 전혀 실행되지 않습니다.

(귀하의 것이 아님) file1file2동일한 파일이어야 하는 경우 다음을 수행할 수 있습니다.

awk 'FILENAME == ARGV[1] {...} ...' file1 ./file1

또는:

awk 'FILENAME == "-" {...} ...' - <file1 file1

더 좋은 방법(휴대 가능하고 효율적):

awk '!file1_processed {...} ...' file1 file1_processed=1 file2

예를 들어, 적용해야 하는 경우 ./*.txt다음과 같이 할 수 있습니다.

set -- ./*.txt
first=$1; shift
awk '!first_processed {...} ...' "$first" first_processed=1 "$@"

GNU awk특정 방법:

awk 'ARGIND == 1 {...} ...' file1 file2

답변2

test크기가 0인 파일에 대한 기능이 있습니다 .

if test -s apple.txt
then 
    ## apple.txt non empty
    code ...
else
    ## file empty
fi

관련 정보