awk 및 if 문

awk 및 if 문

awk를 사용하여 파일에서 인쇄하려고 하는데 출력이 비어 있습니다. 이것은 지금까지 내 코드입니다

accountNum=$1
while read -r LINE || [[ -n $LINE ]] ; do
            awk -F',' '{ if($1==accountNum) { print $3.$2 } }' Accounts
done < Accounts

나는 또한 이것을 시도했습니다 :

accountNum=$1
while read -r LINE || [[ -n $LINE ]] ; do
            echo $LINE  | awk -F',' '{ if($1==accountNum) { print $3.$2 } }' 
done < Accounts

입력 파일은 다음과 같습니다.

1,Doe,John
2,Rooney,Wayne
3,Smith,Will
4,Crow,Russel
5,Cruise,Tom

이 파일을 실행할 때 예상되는 출력은 다음과 같습니다.

$./file.sh 3
Will Smith

하지만 다음 메시지가 나타납니다.

$./file.sh 3
$

즉, 아무것도 인쇄되지 않는다는 의미입니다. Cut의 솔루션에 대해 알고 있지만 awk를 사용하고 싶습니다.

답변1

-v다음 옵션을 사용해야 합니다 awk.

awk -F',' -v accNum="$1" '$1 == accNum {print $3,$2}'

큰따옴표를 사용 하면 $1쉘이 모든 특수 문자(있는 경우)를 처리합니다.

답변2

당신은:

accountNum=$1
awk -F',' '{ if($1==accountNum) { print $3.$2 } }' Accounts

쉘 변수는 어떻게 accountNum입력 됩니까 awk? 그렇지 않습니다. awk해당 값을 명시적으로 제공해야 합니다. 당신은 그것을 사용할 수 있습니다 :

awk -F',' '{ if($1=='"$accountNum"') { print $3.$2 } }' Accounts

작은 따옴표를 생략하고 쉘이 해당 변수의 값을 명령으로 대체한 awk다음 나머지 명령 문자열에 작은 따옴표를 다시 입력하도록 합니다.

더 좋고 적어도 더 관용적인 스크립트는 다음과 같습니다.

#!/bin/sh
accountNum=$1
awk -F, '$1 == "'"$accountNum"'" { print $3,$2 }' Accounts

숫자가 아닌 계정 번호(대체된 변수 참조)를 처리하고 명시적 블록 대신 패턴 블록을 사용하며 if( {}이전 테스트가 true인 경우 이 블록이 실행됨) 필요한 경우 이름 사이의 공백을 인쇄합니다(때문에 ,). 명시적인 사용을 선호하는 경우 기존 문 내부로 if테스트를 이동하세요 .if

실제 목표에 따라 awk현재 수행 중인 작업에 가장 적합하지 않을 수도 있습니다. 스크립트에 따옴표가 있으면 $1위의 방법은 여전히 ​​실패합니다 . 쉘 루프가 출력을 여러 번 반복하더라도 유용한 작업은 수행되지 않습니다.

답변3

귀하의 스크립트는 실제로 작업을 수행하며 awk전혀 필요하지 않습니다.

while IFS=, read -r num last first
    do  [ $((num==accountNum)) -eq 1 ] && 
        printf '%s.%s\n' "$first" "$last"
done < Accounts

이것이 개별적으로 사용하는 것보다 더 낫거나 더 효율적인 솔루션이라고 말하는 것은 아니지만 awk루프를 원한다면 각 행에 대해 별도의 프로세스를 수행하는 while...read것보다 확실히 더 나을 것입니다 . awk그냥 참고용인 것 같아요.

답변4

#!/bin/bash

awk -v a="$1" -F ',' '$1 == a { print $3, $2 }' Accounts

-v a="$1"변수를 스크립트의 첫 번째 명령줄 인수 값으로 설정한 다음 입력이 쉼표로 구분되도록 지정합니다 . 첫 번째 열이 값과 같으면 다른 두 열은 역순으로 인쇄됩니다.awka-F ','a

awk첫 번째 열을 설정되지 않은 변수와 비교하면 출력에 아무 것도 나오지 않습니다 accountNum.

항목의 첫 번째 열에 0이 포함되어 있으면 해당 항목이 인쇄됩니다. 이는 설정되지 않은 변수의 값이 awk0으로 평가되기 때문입니다.

관련 정보