CSV 파일이 있는데 CSV 파일에서 데이터를 검색하기 위해 여러 번 확인하고 싶습니다. 나는 다음과 같은 조건을 알고 있어야 하며, 쉘 스크립트에서 awk를 사용하여 만족시키려고 합니다.
if ( ColD == "TRX" || ColD == "TX" )
{
if (ColJ == "BTS INT UNAFF" || ColJ == "LOCAL MODE")
{
if (ColL !="OPER" && ColL != "") #Second Value shouldn't be blank
{
if (ColU != "2000")
{
if (ColA != "*_*") # Should not contain _ in the value.
then
print all the resulting filtered columns of this csv file
여기서 ColA, ColB 등은 $1, $2 등으로 사용하는 열 번호입니다.
이제 단일 if 조건의 간단한 awk 사용법이 다음과 같다는 것을 알고 있습니다.
awk -F, '{
if ($23 == "TOP36")
print $11
}' $INPUT_PATH/$fileName
그리고 중첩된 if 조건은 다음과 같이 찾을 수 있습니다.
awk '
{if ( $6 == 0 && $8 > 0 && $8 <= 9 ) { $6 = "left" } else {
if ( $8 == 0 && $6 > 0 && $6 <= 15 ) { $6 = "bottom" } else {
if ( $8 == 9 && $6 > 0 && $6 <= 15 { $6 = "top" } else {
if ( $6 == 15 && $8 > 0 && $8 <= 9 { $6 = "right" }
}
}
}
} {print}'
하지만 위에서 만족하는 if 조건을 넣고, 아래에 등등을 넣으면 내 조건이 만족될 수 있을 것 같아요. awk if 문을 사용하여 이 작업을 어떻게 수행할 수 있나요? 더 좋은 방법이 있나요?
답변1
중첩됨if
성명효과적으로 성명서 and
성명서따라서 중첩을 단계별로 진행할 때 특정 처리를 수행할 필요가 없으면 모두 연결하면 됩니다 &&
.
awk '{ if( ( $4 == "TRX" || $4 == "TX" ) &&
( $10 == "BTS INT UNAFF" || $10 == "LOCAL MODE" ) &&
( $12 != "OPER" && $12 != "" ) && # Second Value should not be blank
( $22 != "2000") &&
( !match( $1, "_") ) ) # Should not contain _ in the value.
{ print }
}' FS=, file
필드 구분 기호를 정의하려면 다음을 사용할 수 있습니다.옵션-F,
바꾸다범위FS=,
또는 원하는 경우 코드의 파일 전처리 블록으로 완전히 래핑합니다 awk
.BEGIN{ }
BEGIN{ FS="," }