여러 출력 파일을 생성하고 런타임에 이러한 출력 파일을 사용하는 스크립트가 있습니다.
다음은 스크립트에 의해 생성된 일부 파일입니다: 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.csv
nawk
section_fruit_out_lookup.csv
nawk
nawk
section_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
첫 번째 파일이 비어 있으면 전혀 실행되지 않습니다.
(귀하의 것이 아님) file1
및 file2
동일한 파일이어야 하는 경우 다음을 수행할 수 있습니다.
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