문자열에서 다른 필드를 추출하기 위해 awk를 사용하려고 합니다.
예:
selected="a2.flac|a3.flac|a4.flac"
first_file=$(echo "$selected" | awk -F'|' '{print $1}')
위의 코드는 내가 기대하는 a2.flac을 반환합니다. 하지만 이제는 변수를 반복하여 한 번에 하나의 파일을 꺼내고 싶습니다. 그래서 나는 이것을 시도했습니다 :
i=1
first_file=$(echo "$selected" | awk -F'|' '{print $i}')
나는 이것이 첫 번째 파일을 가져올 것이라고 생각했지만... 아무것도 반환되지 않았습니다. 그래서 다음에 이것을 시도했습니다.
i=1
first_file=$(echo "$selected" | awk -F'|' '{print \$i}')
이것도 작동하지 않습니다. 나는 또한 이것을 시도했습니다 :
i=1
first_file=$(echo "$selected" | awk -F'|' n=$i '{print $n}')
또한 이것을 시도했습니다.
i=1
first_file=$(echo "$selected" | awk -v -F'|' n=$i '{print $n}')
내가 시도한 모든 것이 작동하지 않는 것 같습니다. 나는 무엇이 효과가 있는지 모른다.
답변1
$i
쉘 변수가 있지만 액세스 awk
할 수 없으므로 $i
null로 평가됩니다. i) 스크립트와 함께 double qupted를 사용하여 쉘이 실행 awk
에 전달하기 awk
전에 변수를 확장하도록 하거나 ii) 변수 awk
로 전달할 수 있습니다.awk
큰따옴표를 사용하세요. 이제 셸이 변수를 확장하므로 첫 번째 변수를 이스케이프하여 셸에서 해석하지 않고
$
셸로 전달되도록 해야 합니다.awk
$ i=1 $ first_file=$(echo "$selected" | awk -F'|' "{print \$$n}") $ echo "$first_file" a2.flac
변수를 에 전달하려면
awk
다음 구문이 필요합니다.거의옳은:$ first_file=$(echo "$selected" | awk -F'|' -vi="$i" '{print $i}') $ echo "$first_file" a2.flac
답변2
당신은 거의 성공했습니다
i=1
first_file=$(echo "$selected" | awk -v n="$i" -F'|' '{print $n}')
- 변수를 설정하려면 -v name=value를 사용하세요.
답변3
$i 값은 쉘에 의해 설정되며 이를 수행하려면 문자열을 큰따옴표로 묶거나 따옴표를 해제해야 합니다. 따라서 귀하의 라인은 다음과 같습니다.
i=1; first_file=$(echo "$selected" | awk -F'|' '{print $i}') # original
i=1; first_file=$(echo "$selected" | awk -F'|' '{print $'$i'}') # un-quoted
i=1; first_file=$(echo "$selected" | awk -F'|' '{print $'"$i"'}') # double-quoted
i=1; first_file=$(echo "$selected" | awk -F'|' "{print \$$i}") # full double-quoted
물론 가장 올바른 방법은 awk에게 var의 값이 무엇인지 알려주고 이를 사용하는 것입니다(변수 이름의 차이를 명확하게 하기 위해 jj를 사용했습니다).
i=1; first_file=$(echo "$selected" | awk -F'|' -v jj="$i" '{print $jj}')
아마도 보다 관용적인 접근 방식은 다음과 같습니다(파이프 "|"로 인해 하위 쉘이 없음).
i=1; first_file="$( <<<"$selected" awk -F\| '{print $'$i'}')"