이상한 와드 문제

이상한 와드 문제

문자열에서 다른 필드를 추출하기 위해 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할 수 없으므로 $inull로 평가됩니다. 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'}')"

관련 정보