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"
변수를 스크립트의 첫 번째 명령줄 인수 값으로 설정한 다음 입력이 쉼표로 구분되도록 지정합니다 . 첫 번째 열이 값과 같으면 다른 두 열은 역순으로 인쇄됩니다.awk
a
-F ','
a
awk
첫 번째 열을 설정되지 않은 변수와 비교하면 출력에 아무 것도 나오지 않습니다 accountNum
.
항목의 첫 번째 열에 0이 포함되어 있으면 해당 항목이 인쇄됩니다. 이는 설정되지 않은 변수의 값이 awk
0으로 평가되기 때문입니다.